栈(Stack)结构满足Lifo
(Last in first out)。
栈常见的操作有:
- push()
- pop()
- peek()
- isEmpty()
- size()
- toString()
栈结构的封装可以基于数组或者基于链表来封装。
接下来使用JavaScript
基于数组来封装一个栈结构:
function Stack() {
this.item = [];
// 栈的相关操作
// 1. 将元素压入栈
Stack.prototype.push = function(element) {
this.item.push(element);
return this.item.length;
}
// 2. 从栈中取出元素
Stack.prototype.pop = function() {
return this.item.pop();
}
// 3. 查看栈顶元素
Stack.prototype.peek = function() {
return this.item[this.item.length - 1];
}
// 4. 判断栈是否为空
Stack.prototype.isEmpty = function() {
return this.item.length == 0;
}
// 5. 获取栈中元素的个数
Stack.prototype.size = function() {
return this.item.length;
}
// 6. 将栈中元素以字符串形式返回
Stack.prototype.toString = function() {
let resultString = '';
for (let i = 0; i < this.item.length; i ++) {
resultString += this.item[i] + ' ';
}
resultString = resultString.trim();
return resultString;
}
}
然后只要使用new Stack
就可以创建一个Stack
实例。
可以用封装的栈结构来封装一个十进制转换为二进制的函数:
function decToBin(decNumber) {
let stack = new Stack();
while (decNumber > 0) {
// 将每一次除法后的余数赋值压入栈中
stack.push(decNumber % 2);
// 将每一次除法后的商赋值给被除数
decNumber = Math.floor(decNumber / 2);
}
// 从栈中取出元素
let binString = '';
while (!stack.isEmpty()) {
binString += stack.pop();
}
let binNumber = Number(binString);
return binNumber;
}