如何用兩個隊列實現棧

隊列和棧的區別

  • 隊列是先進先出markdown

  • 棧是先進後出ui

思路

使用兩個隊列能夠實現棧,一個 a 隊列, 一個 b 隊列,this

  • 第一步, 入棧值放入 a 隊列
  • 第二步, 入棧值放入 b 隊列, 再把 a 隊列的值彈出,按順序放到 b 隊列, 直到 a 隊列清空
  • 第二步, 入棧值放入 a 隊列, 再把 b 隊列的值彈出,按順序放到 a 隊列, 直到 b 隊列清空
  • ... 如此循環

步驟圖

  • 第1步 push
A B
h
  • 第2步 push
A B
h
e
  • 第3步 push
A B
h
e
l
  • 第4步 push
A B
h
e
l
l
  • 第5步 push
A B
h
e
l
l
o
  • 第6步 pop
A B
h
e
l
l
  • 第7步 pop
A B
h
e
l
  • 第8步 pop
A B
h
e
  • 第9步 pop
A B
h
  • 第10步 pop
A B

代碼

const Queue = require('./queue')

class Stack {
    constructor() {
        this.A = new Queue()
        this.B = new Queue()
    }

    push(val) {
        if(this.A.size()) {
            this.B.enqueue(val)
            while(this.A.size()) {
                this.B.enqueue(this.A.dequeue())
            }
        }else{
            this.A.enqueue(val)
            while(this.B.size()) {
                this.A.enqueue(this.B.dequeue())
            }
        }
    }

    pop() {
        if(this.A.size()) {
            console.log(this.A.peek());
            return this.A.dequeue()
        }else{
            console.log(this.B.peek());
            return this.B.dequeue()
        }
    }
}

const stack = new Stack()
stack.push('h');
stack.push('e');
stack.push('l');
stack.push('l');
stack.push('o');
stack.pop();     //o
stack.pop();     //l
stack.pop();     //l
stack.pop();     //e
stack.pop();     //h
複製代碼

總結

定義兩個棧 每次入棧的時候,先把數據放入空隊列中,再把另外一個有數據的隊列所有放入剛纔的空隊列, 出棧的時候彈出有數據的那個棧spa

相關文章
相關標籤/搜索