题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
思路分析
我们所学的每一种数据结构,本质上研究的是对数据如何存储和使用,这就必然涉及到增加,删除,修改,获取这四个操作,日常工作其实所作的也逃不掉这四种业务。
那么在考虑实现这些方法时,我们优先考虑如何实现增加,道理很简单,只有先增加,才能继续研究如何删除,修改,获取,否则,没有数据,怎么研究?
就这道题目而言,我们先考虑如何实现appendTail方法,两个栈分别命名为stack_1 和 stack_2,其中 stack_1 用来存储数据,队列 appendTail 方法只能操作 stack_1
接下来考虑 deleteHead 方法,队列的头,在 stack_1 的底部,栈是先进后出,目前取不到,可不还有stack_2么,把stack_1里的元素都倒入到stack_2中,这样,队列的头就变成了stack_2的栈顶,这样不就可以执行stack_2.pop()来删除了么。执行完pop后,需要把stack_2里的元素再倒回到stack_1么,不需要,现在队列的头正好是stack_2的栈顶,恰好可以操作,队列的 deleteHead 方法借助栈的pop方法完成,队列的head方法借助栈的top方法完成。
如果stack_2是空的怎么办?把stack_1里的元素都倒入到stack_2就可以了,这样,如果stack_1也是空的,说明队列就是空的,返回null就可以了。
appendTail始终都操作stack_1,deleteHead和head方法始终都操作stack_2。
代码实现
Stack
class Stack {constructor() {this.count = 0;this.items = {};}push(element) {this.items[this.count] = element;this.count++;}pop() {if (this.isEmpty()) {return undefined;}this.count--;const result = this.items[this.count];delete this.items[this.count];return result;}top() {if (this.isEmpty()) {return undefined;}return this.items[this.count - 1];}isEmpty() {return this.count === 0;}size() {return this.count;}clear() {/* while (!this.isEmpty()) {this.pop();} */this.items = {};this.count = 0;}toString() {if (this.isEmpty()) {return '';}let objString = `${this.items[0]}`;for (let i = 1; i < this.count; i++) {objString = `${objString},${this.items[i]}`;}return objString;}}
StackQueue
class StackQueue {constructor() {this.stack_1 = new Stack()this.stack_2 = new Stack()}appendTail(ele) {this.stack_1.push(ele)}head() {if (this.stack_2.isEmpty() && this.stack_1.isEmpty()) {return null}if (this.stack_2.isEmpty()) {while (!this.stack_1.isEmpty()) {this.stack_2.push(this.stack_1.pop())}}return this.stack_2.top()}deleteHead() {if (this.stack_2.isEmpty() && this.stack_1.isEmpty()) {return null}if (this.stack_2.isEmpty()) {while (!this.stack_1.isEmpty()) {this.stack_2.push(this.stack_1.pop())}}return this.stack_2.pop()}}
