直接上代码:
(这里只是实现一个栈的基本功能,完整功能的JS栈在下面)
//用数组代替栈
//若栈内没有元素,往栈底添加一个
//取栈内元素时,从栈顶取,也就是存放这个栈数组的最后一个元素从后往前取元素
//取元素前判断栈内是否有元素
//显示栈内所有元素时,首先判断栈内是否有元素,若没有返回栈空,若有从后往前返回栈内元素
//本例没有规定栈的初始大小,你可以规定初始化栈的大小然后判断栈满,在栈满时无法继续添加元素
function createStack(){
var stack = [];
//入栈
this.append = function (e){
stack.push(e);
}
//出栈
this.getStack = function(){
if(stack.length == 0){
return "栈空";
}else{
return stack.pop();
}
}
//显示栈内所有元素
this.show = function(){
if(stack.length != 0){
for(var i=stack.length-1;i>-1;i--){
console.log(stack[i]);
}
}else{
console.log("栈空")
}
}
//清空栈内所有元素
this.deleteAll = function(){
stack = [];
}
}
var stack =new createStack();
stack.append(1);
stack.append(3);
stack.append(9);
stack.append('A');
stack.show();
stack.deleteAll();
stack.show();
console.log(stack.getStack());
结果:
A
9
3
1
栈空
栈空
下面我们利用这个栈实现一下数制转换:
比如将十进制数N转换为j进制的数:
对N除j取余数,然后将结果依次存入栈中,最后再一次性将数据从栈中取出,结果就是这个N对应的j进制
function createStack(){
var stack = [];
//入栈
this.append = function (e){
stack.push(e);
}
//出栈
this.getStack = function(){
if(stack.length == 0){
return "栈空";
}else{
return stack.pop();
}
}
//显示栈内所有元素
this.show = function(){
if(stack.length != 0){
for(var i=stack.length-1;i>-1;i--){
console.log(stack[i]);
}
}else{
console.log("栈空")
}
}
//清空栈内所有元素
this.deleteAll = function(){
stack = [];
}
}
var stack =new createStack();
//下面将十进制数138转换为二进制数()
var N=138;
var run=1;
while(run){
stack.append(N%2);
N=Math.floor(N/2);//向下取整
if(N==0){
run=0;
}
}
stack.show();
结果:
1
0
0
0
1
0
1
0
//10001010为138的二进制
完整功能的JS栈:
function createStack(n){
var stack = [];
//创建一个长度为n的栈,len不可变
var len = n;
//栈中元素的数量
var element = 0;
//入栈,若栈满则提示
this.append = function(o){
if(element<len){
//如果传入一个数组
if(o instanceof Array){
for(var i=0;i<o.length;i++){
stack.push(o[i]);
element+=1;
//若数组内的元素数量大于可入栈的元素数量,返回栈满信息
if(element==len){
return "栈已满,无法继续添加!";
}
}
}else{
//传入一个普通变量
stack.push(o);
element+=1;
}
}
else{
return "栈已满,无法继续添加!";
}
}
//出栈,出栈前判断是否栈空
this.outStack = function(){
if(element>0){
var result = stack[element-1];
//删除这个栈顶元素
stack.pop();
//减少一个栈内元素
element-=1;
return result;
}
else{
return "栈空,请添加元素!"
}
}
//显示所有栈内元素,显示前判断栈是否栈空
this.showStack = function(){
if(element>0){
//后进先出
for(var i=element-1;i>-1;i--){
console.log(stack[i]);
}
}
else{
return "栈空,请先添加元素!"
}
}
//初始化栈
this.resetStack = function(){
stack = [];
element = 0;
}
}
var stack1=new createStack(10);
stack1.append([1,2,3]);
stack1.showStack();
console.log("-----------------------------------------");
console.log(stack1.outStack());
console.log("-----------------------------------------");
stack1.showStack();
console.log("-----------------------------------------");
stack1.append(5);
stack1.showStack();
console.log("-----------------------------------------");
stack1.append([1,2,3,4,5,6,7,8,9]);
stack1.showStack();
输出:
3
2
1
-----------------------------------------
3
-----------------------------------------
2
1
-----------------------------------------
5
2
1
-----------------------------------------
7
6
5
4
3
2
1
5
2
1
附上一些数学方法:
// 1.只保留整数部分(丢弃小数部分)
parseInt(5.1234);// 5
// 2.向下取整(<= 该数值的最大整数)和parseInt()一样
Math.floor(5.1234);// 5
// 3.向上取整(有小数,整数就+1)
Math.ceil(5.1234);
// 4.四舍五入(小数部分)
Math.round(5.1234);// 5
Math.round(5.6789);// 6
// 5.绝对值
Math.abs(-1);// 1
// 6.返回两者中的较大值
Math.max(1,2);// 2
// 7.返回两者中的较小值
Math.min(1,2);// 1
// 随机数(0-1)
Math.random();
// 随机数(1-3)
(Math.random()*2+1);