1. 程式人生 > >棧/佇列 互相模擬實現

棧/佇列 互相模擬實現

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

思路:大概這麼想:用一個輔助棧把進第一個棧的元素倒一下就好了。

比如進棧1,2,3,4,5

第一個棧:

5

4

3

2

1

然後倒到第二個棧裡

1

2

3

4

5

再倒出來,順序為1,2,3,4,5

實現佇列

然後要注意的事情:

1)棧2非空不能往裡面倒數,順序就錯了。棧2沒數再從棧1倒。

2)棧1要倒就一次倒完,不倒完的話,進新數也會循序不對。

import java.util.Stack;
 
public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
     
    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();
    }
}

用兩個佇列實現棧,要求同上:

這其實意義不是很大,有些資料結構書上甚至說兩個佇列不能實現棧。

其實是可以的,只是時間複雜度較高,一個彈出操作時間為O(N)。

思路:兩個佇列,編號為1和2.

進棧操作:進1號佇列

出棧操作:把1號佇列全弄到2號佇列裡,剩最後一個別壓入,而是返回。

最後還得把1和2號換一下,因為現在是2號有數,1號空。

僅僅有思考價值,不實用。

比如壓入1,2,3

佇列1:1,2,3

佇列2:空

依次彈出1,2,3:

佇列1裡的23進入2號,3彈出

佇列1:空

佇列2:2,3

佇列2中3壓入1號,2彈出

佇列1:3

佇列2:空

佇列1中只有一個元素,彈出。

上程式碼:

public class TwoQueueImplStack {
	Queue<Integer> queue1 = new ArrayDeque<Integer>();
	Queue<Integer> queue2 = new ArrayDeque<Integer>();
//壓入
	public void push(Integer element){
		//都為空,優先1
		if(queue1.isEmpty() && queue2.isEmpty()){
			queue1.add(element);
			return;
		}
		//1為空,2有資料,放入2
		if(queue1.isEmpty()){
			queue2.add(element);
			return;
		}
		//2為空,1有資料,放入1
		if(queue2.isEmpty()){
			queue1.add(element);
			return;
		}
	}
//彈出
	public Integer pop(){
		//兩個都空,異常
		if(queue1.isEmpty() && queue2.isEmpty()){
			try{
				throw new Exception("satck is empty!");
			}catch(Exception e){
				e.printStackTrace();
			}
		}	
		//1空,2有資料,將2中的資料依次放入1,最後一個元素彈出
		if(queue1.isEmpty()){
			while(queue2.size() > 1){
				queue1.add(queue2.poll());
			}
			return queue2.poll();
		}
		
		//2空,1有資料,將1中的資料依次放入2,最後一個元素彈出
		if(queue2.isEmpty()){
			while(queue1.size() > 1){
				queue2.add(queue1.poll());
			}
			return queue1.poll();
		}
		
		return (Integer)null;
	}
//測試
	public static void main(String[] args) {
		TwoQueueImplStack qs = new TwoQueueImplStack();
		qs.push(2);
		qs.push(4);
		qs.push(7);
		qs.push(5);
		System.out.println(qs.pop());
		System.out.println(qs.pop());
		
		qs.push(1);
		System.out.println(qs.pop());
	}
}