60.用棧實現佇列
阿新 • • 發佈:2022-03-17
請你僅使用兩個棧實現先入先出佇列。佇列應當支援一般佇列支援的所有操作(push、pop、peek、empty):
實現 MyQueue 類:
void push(int x) 將元素 x 推到佇列的末尾
int pop() 從佇列的開頭移除並返回元素
int peek() 返回佇列開頭的元素
boolean empty() 如果佇列為空,返回 true ;否則,返回 false
說明:
你 只能 使用標準的棧操作 —— 也就是隻有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的語言也許不支援棧。你可以使用 list 或者 deque(雙端佇列)來模擬一個棧,只要是標準的棧操作即可。
/* 解題思路 佇列的特性是 FIFOFIFO(先入先出),而棧的特性是 FILOFILO(先入後出)。 知道兩者特性之後,我們需要用兩個棧來模擬佇列的特性,一個棧為入隊棧,一個棧為出對棧。 當出隊棧存在內容時,出隊棧的棧頂,即為第一個出隊的元素。 若出隊棧無元素,我們的需求又是出隊的話,我們就需要將入隊棧的內容反序匯入出隊棧,然後彈出棧頂即可。 注意:根據棧的的特性,我們僅能使用 pushpush 和 poppop 操作。 */ class MyQueue { Deque<Integer> inStack; Deque<Integer> outStack; public MyQueue() { inStack = new LinkedList<Integer>(); outStack = new LinkedList<Integer>(); } public void push(int x) { inStack.push(x); } public int pop() { if (outStack.isEmpty()) { in2out(); } return outStack.pop(); } public int peek() { if (outStack.isEmpty()) { in2out(); } return outStack.peek(); } public boolean empty() { return inStack.isEmpty() && outStack.isEmpty(); } private void in2out() { while (!inStack.isEmpty()) { outStack.push(inStack.pop()); } } }