這篇文章裡的題目均整理於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。