前言:
博主現在坐在教室,本來打算寫《代碼面試指南》中的第4題,但是現在很累,腦瓜轉不動了,再寫代碼的話,效率太低了,不如把第二題記錄起來,go,go,go..!
用兩個棧組成的隊列
題目
編寫一個類,用兩個棧實現隊列,支持隊列的基本操作(add,poll,peek)
分析:
我與大家一起分析一下,這題其實就是考察特殊數據結構的設計能力,自己編寫一個特殊的隊列,這個隊列的方法中除了要有普通隊列的基本操作之外,還要有兩個棧成員,並在這兩個棧的基礎上進行功能的實現。
設兩個棧分別爲stack1, stack2。 假如1,2.3.4.5分別入棧,那麼由於棧的先進後出性,出棧順序應該是5.4.3.2.1。但是隊列是先進先出,其出隊順序應該是1.2.3.4.5。那麼我們怎麼辦呢?其實也挺容易想到的,就是再拿一個棧stack2, 把stack1的順序全部彈出到
stack2, 此時stack2 中從棧頂到棧底的元素就分別是5.4.3.2.1了,此時元素的出棧順序就和隊列中的出隊順序一樣了。OK,,到這邊是不是覺得很簡單,躍躍欲試啦,但是其實有個地方很容易出錯的:
也就是隻有stack2爲空時,才能從stack1把元素倒入stack2,而且必須一次性全部倒入stack2......
假設沒有全部倒入,而是隻倒入了5.4(如圖1)在這之後,如果我們執行出隊操作,那麼出隊的元素就會是5,但實際上率先出隊的應該是1.
假設在stack2不爲空的時候,就從stack1把元素全部倒入stack2(如圖二).。此時stack2中的元素還未空,stack1有兩個元素分別是7.6,如果此時把7.6倒入stack1,在這之後若進行隊列的出隊操作,那麼率先出隊的元素會是6,但實際上應該是1。
stack1 stack2 stack1 stack2
5 1
4 2
3 3
2 4 7 4
1 5 6 5
(圖 1) (圖 2)
心得:先自己思考解決方法,思考不出來的話纔看下書上的思路分析,但是不要看代碼。
看完思路分析後,自己動手實現,看看自己能不能成功實現。
如果實現不出來,再看書上的代碼,看完後再自己動手實現(到了這步就萬萬不能再看書上的代碼了,必須自己實現)
附Java代碼:
package code_180;
import java.util.*;
import java.util.Stack;
public class TwoStack {
private Stack<Integer> Stack1;
private Stack<Integer> Stack2;
TwoStack(){
this.Stack1 = new Stack<Integer>();
this.Stack2 = new Stack<Integer>();
}
public void add(int newNum) {
this.Stack1.push(newNum);
}
public void poll() {
if(this.Stack2.empty()) {
while(this.Stack1.empty() == false) {
int tempNum = this.Stack1.peek();
this.Stack1.pop();
this.Stack2.push(tempNum);
}
this.Stack2.pop();
}
else
this.Stack2.pop();
}
public int peek() {
if(this.Stack2.empty()) {
while(this.Stack1.empty() == false) {
int tempNum = this.Stack1.peek();
this.Stack1.pop();
this.Stack2.push(tempNum);
}
return this.Stack2.peek();
}
else
return this.Stack2.peek();
}
//int []arrayTest = {1,2,3,4,5};
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] arrayTest = {1,2,3,4,5};
TwoStack myQueue = new TwoStack();
for(int i = 0 ;i<arrayTest.length; i++) {
myQueue.add(arrayTest[i]);
}
myQueue.poll();
System.out.println(myQueue.peek());
}
}
學習到的關於Java中的新知識:
如果類中含有某個類,我必須在構造函數中顯示的new出個實例,不然會拋出異常,這與c++中的不一樣的是,C++中string的構造函數會被自動調用,會自動創建實例,一開始我兩者類比了,但是出錯了,雖然Stack是包中的類,但是也必須自己在構造函數中顯示的new一個對象。