用兩個棧實現隊列

1. 題目描述

用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素爲int類型。

2. 解題思路

  • 入隊:將元素進棧A
  • 出隊:判斷棧B是否爲空,如果爲空,則將棧A中所有元素pop,並push進棧B。
  • 如果棧B不爲空,棧B出棧。

3. 代碼

public class TwoStackImplementationQueues {

	public static Stack<Integer> stack1 = new Stack<Integer>();
	public static Stack<Integer> stack2 = new Stack<Integer>();
	
	public static void main(String [] args){		 
		 TwoStackImplementationQueues mm=new TwoStackImplementationQueues();
		 for (int i=0;i<5;i++){
			 mm.push(i);
		 }
		 
		 while(true){
			 System.out.println(mm.pop());
		 }
		 
	 }
	
	 public void push(int node) {
	        stack1.push(node);
	    }
	     
    public int pop() {
    	
        if(stack1.empty()&&stack2.empty()){
            throw new RuntimeException("Queue is empty!");
        }        
        if(stack2.empty()){
            while(!stack1.empty()){
                stack2.push(stack1.pop());
            }
        }        
        return stack2.pop();
    }
	    
}

運行:

0
1
2
3
4
Exception in thread "main" java.lang.RuntimeException: Queue is empty!

4. 兩個隊列實現棧

解題思路:

  1. 在push的時候,把元素向非空的隊列內添加
  2. 在pop的時候,把不爲空的隊列中的size()-1個元素poll出來,添加到另爲一個爲空的隊列中,再把隊列中最後的元素poll出來
  3. 兩個隊列在棧不爲空的情況下始終是有一個爲空,另一個不爲空的。push添加元素到非空的隊列中,pop把非空隊列的元素轉移到另一個空的隊列中,直到剩下最後一個元素,這個元素就是要出棧的元素(最後添加到隊列中的元素)。
  4. 最終兩個隊列都爲空,這裏其實只是利用隊列的先進先出做了一箇中間轉換。

代碼;

import java.util.LinkedList;
import java.util.Queue;


public class TwoQueuesImplementStack {

	private static Queue<Object> queue1=new LinkedList<Object>();
	private static Queue<Object> queue2=new LinkedList<Object>();
	
	public static void main(String[] args) {
		TwoQueuesImplementStack mm =new TwoQueuesImplementStack();
		for (int i=0;i<5;i++){
			mm.push(i);
		}
		System.out.println("..............");
		while(true){
			 mm.pop();
		}
		  
}

	// 向隊列中執行入棧操作時,把元素添加到非空的隊列中
	public  void push(Object item){
	    if(!queue1.isEmpty())
	        queue1.offer(item);
	    else
	        queue2.offer(item);
	    System.out.println("入棧元素爲:"+item);
	}

	public  void pop(){
		
	    if((!queue1.isEmpty())||(!queue2.isEmpty())){
	    	
	        if(queue1.isEmpty()){    
	            while(queue2.size()>1){
	                queue1.offer(queue2.poll());
	            }
	            System.out.println("出棧元素爲:"+queue2.poll());
	        }else{
	            while(queue1.size()>1){
	                queue2.offer(queue1.poll());
	            }
	            System.out.println("出棧元素爲:"+queue1.poll());
	        }
	    }
	    else
	        throw new RuntimeException("棧爲空,無法執行出棧操作");
	}


}

運行:

入棧元素爲:0
入棧元素爲:1
入棧元素爲:2
入棧元素爲:3
入棧元素爲:4
..............
出棧元素爲:4
出棧元素爲:3
出棧元素爲:2
出棧元素爲:1
出棧元素爲:0
Exception in thread "main" java.lang.RuntimeException: 棧爲空,無法執行出棧操作

以上是學習筆記,進攻參考。

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