栈
01-栈的相关概念:
栈是一种遵从后进先出原则的有序集合。新添加的或待删除元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
栈也被用于在编程语言的编辑器和内存中保存变量、方法调用等。
02-栈的创建:
栈声明一些方法:
- push()添加一个或多个元素到栈顶
- pop()移除栈顶的元素,同时返回被移除的元素
- peek()返回栈顶元素,不对栈做任何修改
- isEmpty()判断栈中是否有元素,若无则返回true,有则返回false
- clear()移除栈里的所有元素
- size()返回栈的长度
- toString()方法
2.1-创建一个构造函数来表示栈。首先,需要一种数据结构来保存栈里的元素。可以选择数组
function Stack(){
this.item = [];
Stack.prototype.push = function(element){
this.item.push(element);
};
Stack.prototype.pop = function(){
return this.item.pop();
};
Stack.prototype.peek = function(){
return this.item[this.item.length - 1];
};
Stack.prototype.isEmpty = function(){
return this.item.length;
};
Stack.prototype.clear = function(){
this.item = [];
};
Stack.prototype.size = function(){
return this.item.length;
};
Stack.prototype.toString = function(){
var str = '';
for(var i = 0; i < this.item.length; i++){
str += this.item[i] + '';
}
return str;
};
}
2.2-创建一个类来表示栈。首先,需要一种数据结构来保存栈里的元素。可以通过数组
class Stack {
constructor(){
this.item = [];
};
push(element){
this.item.push(element);
};
pop(){
return this.item.pop();
};
peek(){
return this.item[this.item.length - 1];
};
isEmpty(){
return this.item.length === 0;
};
clear(){
this.item = [];
};
size(){
return this.item.length;
};
toString(){
return this.item.join(' ');
};
}
03-栈结构的应用:
3.1-十进制转为其它进制
function scaleTransform(nums,type){
var stack = new Stack();
while(nums){
stack.push(nums % type);
nums = Math.floor(nums / type);
};
var res = '';
while(!stack.isEmpty()){
res += stack.pop();
}
return res;
}
3.2-程序中什么是使用栈实现的呢?
最典型的应用就是函数调用栈,函数之间的相互调用:A调用B,B中又调用C,C中又调用D,那么在执行过程中,会先将A压入栈,A没有执行完,所以不会弹出栈,在A执行的过程中调用了B,会将B压入到栈,这个时候B在栈顶,A在栈底。若是这个B可以执行完,那么B会弹出栈,但是B又调用了C。所以C会入栈,并且在栈顶,而C调用了D,D会压入到栈顶,所以当前的栈顺序是:栈底A->B->C->D栈顶。D执行完,会弹出栈,C/B/A会依次弹出栈。所以就有函数调用栈的称呼,就来自于它们内部的执行机制(通过栈来实现的)
04-面试题:
4.1-在一个栈的输入序列为12345 下面哪个不可能是栈的输出序列?
A. 23415 B.54132 C.23145 D.15432
答案:B
分析:
23415--->1进栈,2进栈,2出栈,3进栈,3出栈,4进栈,4出栈,1出栈,5进栈,5出栈
23145--->1进栈,2进栈,2出栈,3进栈,3出栈,1出栈,4进栈,4出栈,5进栈,5出栈
15432--->1进栈,1出栈,2进栈,3进栈,4进栈,5进栈,5出栈,4出栈,3出栈,2出栈
\