棧/佇列 互相模擬實現
阿新 • • 發佈:2018-12-10
用兩個棧來實現一個佇列,完成佇列的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()); } }