栈基础知识

290 阅读1分钟

栈基础知识

  1. 栈中的数据,从哪儿入,从哪儿出(从头部入栈,并从头部出栈,先入后出FILO)。
  2. 基本操作:出栈(逻辑上的出栈,栈顶指针向下移动一位),入栈(栈顶指针向上移动一位,然后将元素放入相应的位置上)。

栈适合解决什么问题

可以处理具有完全包含关系的问题!例如:“(())”,a=function(){ b() },等一个事件或者一个事物完全包含另一个事件或事物。

栈的典型应用场景

  1. 操作系统中的线程栈
  2. 表达式求值

使用JS实现一个栈

下面使用数组本身所带的api和使用逻辑上的思维方式,实现了两个基础栈结构。

class Stack {
  constructor() {
    this.stack = new Array(); // 创建一个存储区
  }
  push(val) { //入栈
    this.stack.push(val);
    this.output();
  }
  pop() { // 出栈
    if (this.empty()) return;
    this.stack.pop();
    this.output();
  }
  empty() { // 判空
    return this.size() === 0;
  }
  size() { //返回栈中元素数量
    return this.stack.length;
  }
  output() {
    let ret = "";
    for (let i = this.size() - 1; i >= 0 ; i--) {
     ret += ` ${this.stack[i]} `
    }
    console.log(ret);
  }
}
class Stack2 { // 此为逻辑上的的栈,this.stack 其实依然存有值,但是我们的栈顶指针指向的数据是完全正确的。
  constructor() {
    this.stack = new Array(); // 创建一个存储区
    this.top = -1; // 初始化栈顶指针没有值时直接指向-1即可
  }
  push(val) { //入栈
    this.top += 1; //指针向上移动一位
    this.stack[this.top] = val; // 放入值
    this.output();
  }
  pop() { // 出栈
    if (this.empty()) return;
    this.top -= 1; // 指针向下移动一位,逻辑上的出栈
    this.output();
  }
  empty() { // 判空
    return this.top === -1;
  }
  size() { //返回栈中元素数量
    return this.top + 1;
  }
  output() {
    let ret = "";
    for (let i = this.size() - 1; i >= 0 ; i--) {
     ret += ` ${this.stack[i]} `
    }
    console.log(ret);
  }
}
const stackS = new Stack2();
stackS.push(1)
stackS.push(2)
stackS.push(3)
stackS.push(4)
stackS.push(5)
stackS.pop()
stackS.pop()
stackS.pop()
stackS.pop()
stackS.pop()