用兩個棧實現隊列 ——Java從0開始學習系列之路(3)

前言:

博主現在坐在教室,本來打算寫《代碼面試指南》中的第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一個對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章