LeetCode進階23二、225-隊列和棧

勘誤

上一篇訂閱號的推文LeetCode進階103-蛇形打印二叉樹(今日頭條面試題)最後一種方法DFS-非遞歸的編碼實踐部分由於失誤複製粘貼錯了,因爲微信公衆平臺支持修改字符上限爲20,沒法修改,須要查看正確編碼解法的話請點擊查看原文連接,原文掛在掘金上並已作修正。java

概要

隊列結構知足FIFO(first in first out)特色,與棧的FILO(first in last out)剛好相反。實際棧和隊列之間能夠相互模擬,即便用棧模擬隊列或者使用隊列模擬棧。面試

隊列

232. 用棧實現隊列

使用棧實現隊列的下列操做:微信

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());
		}
	}
	
複製代碼

說明

見註釋

225. 用隊列實現棧

使用隊列實現棧的下列操做:

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();
	}
}
複製代碼

編碼說明

見註釋

總結

本篇經過介紹隊列和棧的互相模擬方法增強對其特性的理解。實際開發中,隊列和棧一樣是十分重要的數據結構。最後,若是以爲本篇有所幫助或啓發,不妨關注走一波~

Alt

關注訂閱號 獲取更多幹貨~
相關文章
相關標籤/搜索