栈和队列
栈
-
后进先出
-
底层用数组实现
-
应用
- 函数调用
-
方法
push()添加一个新元素到栈顶位置。pop()移除栈顶的元素,同时返回被移除的元素。peek()返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)。isEmpty()如果栈里没有任何元素就返回true,否则返回false。size()返回栈里的元素个数。这个方法和数组的length属性类似。toString()将栈结构的内容以字符串的形式返回 -
创建
class Stack { constructor() { this.items = []; } } const stack = new Stack();
队列
-
先进先出
-
在队首出队,在队尾入队
-
应用
- 打印多个文件时
- 线程队列
-
底层实现:数组和链表
-
方法
enqueue(element)向队列尾部添加一个(或多个)新的项。dequeue()移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。front()返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息与 Map 类的 peek 方法非常类似)。isEmpty()如果队列中不包含任何元素,返回 true,否则返回 false。size()返回队列包含的元素个数,与数组的 length 属性类似。toString()将队列中的内容,转成字符串形式。
-
创建
class Queue { constructor() { this.items = []; } } const queue = new Queue();
优先队列
- 每个元素不再只是一个数据,还包含优先级。
- 在添加元素过程中,根据优先级放入到正确位置。
方法中,插入和队列有所不同,其余基本一样的
232.用栈实现队列
题目链接:232. 用栈实现队列 - 力扣(LeetCode)
第一想法
JS中没有栈,需要先用数组构建一个栈
再用栈来实现队列
思路
实现队列的先进先出,需要用两个栈来实现输入和输出
初始123入队,对头出队
入队(4),出队(2)
入队比较简单,入队时stack-in 也进栈即可
出队略微复杂一些,让stack-in的元素先全部出栈,再入栈stack-out,再把对应元素出队
JS代码如下:
var MyQueue = function() {
this.stackIn = [];
this.stackOut = [];
};
/**
* @param {number} x
* @return {void}
*/
MyQueue.prototype.push = function(x) {
this.stackIn.push(x);
};
/**
* @return {number}
*/
MyQueue.prototype.pop = function() {
const size = this.stackOut.length;
if(size) {
return this.stackOut.pop();
}
while(this.stackIn.length) {
this.stackOut.push(this.stackIn.pop());
}
return this.stackOut.pop();
};
/**
* @return {number}
*/
MyQueue.prototype.peek = function() {
const x = this.pop();
this.stackOut.push(x);
return x;
};
/**
* @return {boolean}
*/
MyQueue.prototype.empty = function() {
return !this.stackIn.length && !this.stackOut.length;
};
总结
这一题中,栈也是用数组实现的
逻辑很有意思,可以画图多推导几遍
注意出队列的逻辑:
- 如果stackOut里面有元素,那直接返回第一个就行
- 如果没有,需要stackIn的元素进入stackOut再返回
返回队列开头的元素可以直接复用上一个方法
225. 用队列实现栈
思路
直接用一个队列就行
入栈和入队列的操作是一样的
出栈操作:
var MyStack = function() {
this.queue = [];
};
/**
* @param {number} x
* @return {void}
*/
MyStack.prototype.push = function(x) {
this.queue.push(x);
};
/**
* @return {number}
*/
MyStack.prototype.pop = function() {
let n = this.queue.length;
while(n > 1){
this.queue.push(this.queue.shift());
n--;
}
return this.queue.shift();
};
/**
* @return {number}
*/
MyStack.prototype.top = function() {
let n = this.pop();
this.queue.push(n);
return n;
};
/**
* @return {boolean}
*/
MyStack.prototype.empty = function() {
return(this.queue.length === 0);
};
总结
这一题的思路和上一题比较类似
主要是画图理清楚思路