常見棧、隊列面試題

來源:互聯網
上載者:User

這篇文章裡的題目均整理於Cracking the Code Interview 2nd Edition。棧和隊列一般不會在面試題裡面單獨做為一整個題出現,往往都是作為一種輔助的資料結構,利用棧和隊列的性質去解決某一類題目。

棧Stack的特點,先進後出,LIFO。棧的基本操作:push壓棧,pop出棧,peek返回棧頂元素但棧不變化。

棧和隊列裡的元素實現 in Java,這裡用到的範型。如果你不知道什麼是Java的範型,參見這篇文章:http://blog.csdn.net/explorers/article/details/454837

public class Node<T> {public T data;public Node<T> next;}

棧的簡單實現 in Java:

public class Stack<T> {Node<T> top;public void push(T data) {Node<T> item = new Node<T>();item.data = data;item.next = top;top = item;}public Node<T> pop() {if (top == null) {return null;} else {Node<T> item = top;top = top.next;return item;}}public Node<T> peek() {return top;}}

隊列Queue的特點,先進先出,FIFO。隊列的基本操作:enqueue進隊,dequeue出隊。注意千萬不要插隊,jump_the_queue。最近放暑假回國買東西的時候老被人插隊搞得很是艸蛋。

隊列的簡單實現 in Java:

public class Queue<T> {private Node<T> first, last;public void enqueue(T data) {Node<T> item = new Node<T>();item.data = data;if (first == null) {last = item;first = item;} else {last.next = item;last = item;}}public Node<T> dequeue() {if (first == null) {return null;} else {Node<T> item = first;first = first.next;return item;}}}

1. How would you design a stack which, in addition to push and pop, also has a function min which returns the minimum element? Push, pop and min should all operate in O(1) time. 在常數時間裡實現一個棧的插入,刪除,和返回最小值操作。

來源:Cracking the Coding Interview 2nd Edition Charpter3 Question2.

【解答】:棧的插入和刪除操作可以在常數時間完成,但是如何設計這個min()函數呢?最直觀的想法是利用一個新的field來儲存這個最小值,每次push的時候都檢查這個最小值。但問題出在pop的時候,如何pop出去的是最小值,那麼就要重新選擇最小值,如何在O(1)時間找到這個新的最小值呢?

這裡給出一個方法,就是再建一個stack:s2,來儲存迄今位置每次壓棧操作得到的最小值。一旦原棧被pop出的是一個最小值,那麼s2也執行pop操作。

解答的Java實現:http://pastebin.com/ivRpMT8Y 這裡的stack繼承自jdk util包下的Stack。

2. Implement a MyQueue class which implements a queue using two stacks. 用兩個棧實現一個隊列MyClass。

來源:Cracking the Coding Interview 2nd Edition Charpter3 Question5.

【解答】:棧的特點:LIFO,隊列則是FIFO,也就是如果壓入棧的元素可以自底而上的出棧的話,就滿足隊列的情況了。那麼可以想到的辦法,就是反轉一個stack。這裡的兩個stack,一個用來push新的元素稱為newStack,另一個則存放的是反轉過元素的,稱為oldStack。每次enqueue操作,存入newStack中,每次dequeue從oldStack中pop。當oldStack為空白的時候,把newStack中的元素反轉存入oldStack。

另外要注意的就是關於一個queue的基本API,enqueue(),dequeue(),size(),isEmpty()等,但大致的思路不能錯,尤其是enqueue和dequeue操作。

實現in Java:http://pastebin.com/WkFzrh8Z 這裡的stack繼承自jdk util包下的Stack。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.