栈结构
基础知识
- 相关特性
栈结构是一种特殊的数组,普通的数组可以在任意位置插入和删除元素,但是栈结构不可以,栈结构每次仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对的,把另一端称为栈底。进栈与出栈遵循LIFO(last in first out),后进入的元素最先出栈。类似于自动托盘,最后放上的托盘,往往先拿出去使用。
生活中类似于栈的:
处理邮件:最新到的最先处理的
家中取碗
栈在程序中的使用:函数调用栈
举例:函数A调用B,B中又调用C,C中又调用D
在执行过程中,会先将A压入栈,A没有执行完所以不会出栈,在A中调用B,便会将B压入栈顶,并执行B函数,当B调用C时,又将C压入栈顶,执行函数C,当C调用D时,又将D压入栈顶,执行函数D。直到D函数执行完毕后将函数D弹出,继续执行在栈顶的C函数。然后再执行B函数以及A函数。 - 专业术语
进栈:把新元素放到栈顶元素的上面,使之成为新的栈顶元素(又称入栈或压栈)
出栈:把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈结构的实现
function Stack () {
//相关属性
this.item = [];
//相关方法
//1.将元素压入栈
Stack.prototype.push = function (element) {
this.item.push(element);
}
//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;
}
//toString方法
Stack.prototype.toString = function () {
var resultString = ''
this.item.forEach(value => {
resultString += value + ' ';
})
return resultString;
}
}
栈的应用
十进制转二进制
算法:将十进制数字和二整除(二进制是满二进一),直到结果是零为止。如将100转成二进制算法如下
被除数 | 除数 | 结果 | 余数 |
---|---|---|---|
100 | 2 | 50 | 0 |
50 | 2 | 25 | 0 |
25 | 2 | 12 | 1 |
12 | 2 | 6 | 0 |
6 | 2 | 3 | 0 |
3 | 2 | 1 | 1 |
1 | 2 | 0 | 1 |
余数得从后往前读,那么100转成二进制为:1100100
代码实现:
function decToBinary (decNumber) {
var stack = new Stack();
while(decNumber > 0){
stack.push(decNumber % 2);
//向下取整
decNumber = Math.floor(decNumber / 2);
}
var binaryString = '';
while(!stack.isEmpty()){
binaryString += stack.pop();
}
return binaryString;
}