栈是一种遵从后进先出(lifo)原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,顶一端叫做栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
栈也被用在编程语言的编译器和内存中保存变量、方法调用等。
1.栈的创建
声明类
function Stack(){
//Declarations of various properties and functions
}
选择一种数据结构来保存栈里的元素—–数组
var items = [];
为栈声明一些方法
push(ele): 添加一个(或几个)新元素到栈顶。
pop(): 移除栈顶的元素,同时返回被移除的元素。
peek(): 返回栈顶的元素。
isEmpty(): 如果栈为空则返回true,反之返回false。
clear(): 移除栈里的所有元素。
size(): 返回栈里的元素个数。
完整代码
function Stack(){
var items = [];
//add new elements to stackTop
this.push = function(ele){
items.push(ele);
};
//remove elements of stackTop and return this elements
this.pop = function(){
return items.pop();
};
//return elements of stackTop
this.peek = function(){
return items[items.length - 1];
};
//judge the stack is empty
this.isEmpty = function(){
return items.length == 0;
};
//clear the stack
this.clear = function(){
items = [];
};
//return the stack's length
this.size = function(){
return item.length;
};
//console
this.print = function(){
console.log(items.toString);
};
}
使用Stack类
初始化
判断是否为空
添加元素
调用peek方法
调用size方法
输出stack
var stack = new Stack();
console.log(stack.isEmpty()); //true
stack.push(5);
stack.push(8);
console.log(stack.peek()); //8
stack.push(11);
console.log(stack.size()); //3
console.log(stack.isEmpty()); //false
stack.push(15);
stack.pop();
stack.pop();
console.log(stack.size()); //2
stack.print(); //[5, 8]
2.从十进制到二进制
function divideBy2(decNumber) {
var remStack = new Stack(),
rem,
binaryString = '';
while (decNumber > 0) {
rem = Math.floor(decNumber % 2);
remStack.push(rem);
decNumber = Math.floor(decNumber / 2);
}
while (!remStack.isEmpty()) {
binaryString += remStack.pop().toString();
}
return binaryString;
}
在这段代码里,当结果满足和2做整除的条件时,我们会获得当前结果和2的余数,放到栈里。然后让结果和2做整除。另外请注意: JavaScript有数字类型,但是它不会区分究竟是整数还是浮点数。因此,要使用Math.floor函数让除法的操作仅返回整数部分。最后,用pop方法把栈中的元素都移除,把出栈的元素变成连接成字符串。
修改上述代码,改为10进制与任一进制转换
function baseConverter(decNumber, base) {
var remStack = new Stack(),
rem,
digits = '0123456789ABCDEF'; //数字转换 取索引值
baseString = '';
while (decNumber > 0) {
rem = Math.floor(decNumber % base);
remStack.push(rem);
decNumber = Math.floor(decNumber / base);
}
while (!remStack.isEmpty()) {
binaryString += digits[remStack.pop()];
}
return binaryString;
}
栈章节结束~~ヾ(◍°∇°◍)ノ゙
下一节队列~~~