首先,你必须知道栈和队列是什么。它们是一种不同的数据结构。从形态来说栈好像一个桶,所以它的规律是先进后出。队列好似我们现实中排队,规律是先进先出。
理解题目:
为什么要用两个栈实现一个队列?从以上叙述看,栈是先进后出,但我想先进先出,可我不想用队列,也就是说,请你用栈实现先进先出。问法不同而已。
问题解析:
知道了目标,实现起来就比较简单了。重点分三步:
1、利用栈的特点(先进后出)
2、创建两个栈
3、两个栈相互“倒腾”
语言不直观,看下图:
接着把栈2的首位依次取出,对于栈1就实现先进先出了!
代码实现:
class Queue {
constructor() {
this.inputStack = []; // 输入栈
this.outputStack = []; // 输出栈
}
// 入队操作
enqueue(item) {
this.inputStack.push(item);
}
// 出队操作
dequeue() {
if (this.outputStack.length === 0) {
while (this.inputStack.length > 0) {
this.outputStack.push(this.inputStack.pop());
}
}
return this.outputStack.pop();
}
// 获取队首元素
front() {
if (this.outputStack.length === 0) {
while (this.inputStack.length > 0) {
this.outputStack.push(this.inputStack.pop());
}
}
return this.outputStack[this.outputStack.length - 1];
}
// 判断队列是否为空
isEmpty() {
return this.inputStack.length === 0 && this.outputStack.length === 0;
}
// 获取队列长度
size() {
return this.inputStack.length + this.outputStack.length;
}
// 清空队列
clear() {
this.inputStack = [];
this.outputStack = [];
}
}
let queue = new Queue()
queue.enqueue(100)
queue.enqueue(200)
queue.enqueue(300)
queue.dequeue()
queue.dequeue()