1. 程式人生 > >例項2:棧和佇列——用兩個棧實現佇列

例項2:棧和佇列——用兩個棧實現佇列

問題描述用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。

知識拓展棧(Stack)和佇列(Queue)是兩種操作受限的線性表。

線性表:線性表是一種線性結構,它是一個含有n≥0個結點的有限序列,同一個線性表中的資料元素資料型別相同並且滿足“一對一”的邏輯關係。“一對一”的邏輯關係指的是對於其中的結點,有且僅有一個開始結點沒有前驅但有一個後繼結點,有且僅有一個終端結點沒有後繼但有一個前驅結點,其它的結點都有且僅有一個前驅和一個後繼結點。

這種受限表現在:棧的插入和刪除操作只允許在表的尾端進行(在棧中成為“棧頂”),滿足“FILO:First In Last Out”;佇列只允許在表尾插入資料元素,在表頭刪除資料元素,滿足“First In First Out”。

棧與佇列的相同點:

1.都是線性結構。

2.插入操作都是限定在表尾進行。

3.都可以通過順序結構和鏈式結構實現。

4.插入與刪除的時間複雜度都是O(1),在空間複雜度上兩者也一樣。

5.多鏈棧和多鏈佇列的管理模式可以相同。

棧與佇列的不同點:

1.刪除資料元素的位置不同,棧的刪除操作在表尾進行,佇列的刪除操作在表頭進行。

2.應用場景不同;常見棧的應用場景包括括號問題的求解,表示式的轉換和求值,函式呼叫和遞迴實現,深度優先搜尋遍歷等;常見的佇列的應用場景包括計算機系統中各種資源的管理,訊息緩衝器的管理和廣度優先搜尋遍歷等。

3.順序棧能夠實現多棧空間共享,而順序佇列不能。

問題分析:有兩個棧,棧1和棧2.當入棧的時候,我們將它全放進棧1中,當需要出棧的時候,我們將棧1出棧到棧2中,然後再將棧2依次出棧。

程式碼實現:

public class StackAndQueue {
	Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        stack1.push(new Integer(node));
    }
    
    public int pop() {
    	int result;
    	if(stack2.empty()){
    		while(!stack1.empty()){
    			stack2.push(stack1.pop());
    		}
    	}
    	result = stack2.pop().intValue();
    	return result;
    }
    
    public static void main(String[] args) {
    	StackAndQueue andQueue = new StackAndQueue();
    	andQueue.push(123);
    	andQueue.push(456);
    	int a = andQueue.pop();
    	int b = andQueue.pop();
    	System.out.println(a);
    	System.out.println(b);
	}
}

結果輸出:

123

456