栈
栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈顶。
现实生活中就有很多栈的例子。如下图的书本,这一摞书如果要取肯定是先去最上面的那一本,但它是最后一个放上去的,也就是栈顶的元素都是待添加或是待删除的。这就是后进先出的实际例子。
栈的创建:
我们创建一个类来表示栈。先声明:
function Stack() {
//各种属性和方法的声明
}
然后我们需要一种数据结构来保存栈里的元素:
var items = [];
接下来,我们给栈声明一些方法:
- push(element):添加一个或几个新元素到栈顶
- pop():移除栈顶的元素,同时返回被移除的元素
- peek():返回栈顶的元素,不对栈做任何修改
- isEmpty():判断栈里有无元素
- clear():移除栈里的所有元素
- size():返回栈里的元素个数。和数组length属性类似。
我们利用这些方法来实现一个栈:
// 栈
function Stack() {
var items = [];
// 添加一个或几个新元素到栈顶
this.push = function (element) {
items.push(element);
};
// 移除栈顶的元素,同时返回被移除的元素
this.pop = function () {
return items.pop();
};
// 返回栈顶的元素
this.peek = function () {
return items[items.length - 1];
};
// 判断栈里有无元素
this.isEmpty = function () {
return items.length === 0;
};
// 返回栈里的元素个数
this.size = function () {
return items.length;
};
// 移除栈里的所有元素
this.clear = function () {
items = [];
};
this.print = function () {
console.log(items.toString());
};
}
我们来测试下:
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
stack.pop();
console.log(stack.size()); // 2
stack.print(); // 5,8
实例
十进制转二进制
// 十进制转二进制
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;
}
测试
console.log(divideBy2(233)); // 11101001
console.log(divideBy2(10)); // 1010
console.log(divideBy2(1000)); // 1111101000
十进制转任意进制
function baseConverter(decNumber, base) {
var remStack = new Stack(),
rem,
baseString = "",
digits = "0123456789ABCDEF";
while (decNumber > 0) {
rem = Math.floor(decNumber % base);
remStack.push(rem);
decNumber = Math.floor(decNumber / base);
}
while (!remStack.isEmpty()) {
baseString += digits[remStack.pop()];
}
return baseString;
}
测试
console.log(baseConverter(100345, 2)); // 11000011111111001
console.log(baseConverter(100345, 8)); // 303771
console.log(baseConverter(100345, 16)); // 187F9
参考链接: 学习JavaScript数据结构与算法