上一篇訂閱號的推文LeetCode進階103-蛇形打印二叉樹(今日頭條面試題)最後一種方法DFS-非遞歸的編碼實踐部分由於失誤複製粘貼錯了,因爲微信公衆平臺支持修改字符上限爲20,沒法修改,須要查看正確編碼解法的話請點擊查看原文連接,原文掛在掘金上並已作修正。java
隊列結構知足FIFO(first in first out)特色,與棧的FILO(first in last out)剛好相反。實際棧和隊列之間能夠相互模擬,即便用棧模擬隊列或者使用隊列模擬棧。面試
使用棧實現隊列的下列操做:微信
push(x) -- 將一個元素放入隊列的尾部。數據結構
pop() -- 從隊列首部移除元素。微信公衆平臺
peek() -- 返回隊列首部的元素。編碼
empty() -- 返回隊列是否爲空。spa
示例:code
MyQueue queue = new MyQueue();cdn
queue.push(1);blog
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
說明:
你只能使用標準的棧操做 -- 也就是隻有 push to top, peek/pop from top, size, 和 is empty 操做是合法的。
你所使用的語言也許不支持棧。你可使用 list 或者 deque(雙端隊列)來模擬一個棧,只要是標準的棧操做便可。
假設全部操做都是有效的 (例如,一個空的隊列不會調用 pop 或者 peek 操做)。
要使用棧來模擬隊列,根據棧的先進後出的特色(後進先出)會使得元素倒序,不難聯想到使用兩個棧。第一個棧使得順序變成倒序,第二個棧使得倒序又變成順序即最終知足隊列順序的特色。參考圖解:
class MyQueue {
Stack<Integer> s1 = new Stack<Integer>();
Stack<Integer> s2 = new Stack<Integer>();
public MyQueue() {
}
/** * 入"隊列"至隊尾 * * @param x */
public void push(int x) {
s1.push(x);
}
/** * 首元素出「隊列」 * * @return */
public int pop() {
if (!s2.isEmpty()) {
return s2.pop();
}
move();
return s2.pop();
}
/** * 獲取隊列頭部元素 * * @return */
public int peek() {
if (!s2.isEmpty()) {
return s2.peek();
}
move();
return s2.peek();
}
/** * 利用第二個棧將「隊列」中倒序的數據變成正序 */
private void move() {
while (!s1.isEmpty()) {
s2.push(s1.pop());
}
}
複製代碼
見註釋
使用隊列實現棧的下列操做:
push(x) -- 元素 x 入棧
pop() -- 移除棧頂元素
top() -- 獲取棧頂元素
empty() -- 返回棧是否爲空
注意:
你只能使用隊列的基本操做-- 也就是 push to back, peek/pop from front, size, 和 is empty 這些操做是合法的。
你所使用的語言也許不支持隊列。 你可使用 list 或者 deque(雙端隊列)來模擬一個隊列 , 只要是標準的隊列操做便可。
你能夠假設全部操做都是有效的(例如, 對一個空的棧不會調用 pop 或者 top 操做)。
使用隊列模擬棧,須要保證後進先出,在插入新元素到隊列後,循環使得隊列中隊尾元素置頂便可。參考圖解:
class MyStack {
Queue<Integer> queue = new LinkedList<Integer>();
public MyStack() {
}
/** * 入「棧」至「棧」頂 * 元素存入queue隊列後,將存儲元素的queue隊列進行循環直到隊尾元素成爲隊頭 * @param x */
public void push(int x) {
queue.add(x);
for (int i = 0; i < queue.size() - 1; i++) {
queue.add(queue.poll());
}
}
/** * 出「棧」 * @return */
public int pop() {
return queue.poll();
}
/** * 獲取「棧」頂元素 * @return */
public int top() {
return queue.peek();
}
/** * 判斷「棧」是否爲空 * @return */
public boolean empty() {
return queue.isEmpty();
}
}
複製代碼
見註釋
本篇經過介紹隊列和棧的互相模擬方法增強對其特性的理解。實際開發中,隊列和棧一樣是十分重要的數據結構。最後,若是以爲本篇有所幫助或啓發,不妨關注走一波~