栈基础知识
- 栈中的数据,从哪儿入,从哪儿出(从头部入栈,并从头部出栈,先入后出FILO)。
- 基本操作:出栈(逻辑上的出栈,栈顶指针向下移动一位),入栈(栈顶指针向上移动一位,然后将元素放入相应的位置上)。
栈适合解决什么问题
可以处理具有完全包含关系的问题!例如:“(())”,a=function(){ b() },等一个事件或者一个事物完全包含另一个事件或事物。
栈的典型应用场景
- 操作系统中的线程栈
- 表达式求值
使用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()