69 阅读2分钟

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出栈

\