用兩個棧來實現一個隊列,完成隊列的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){//都為空,優先1if(queue1.isEmpty() && queue2.isEmpty()){queue1.add(element);return;}//1為空,2有數據,放入2if(queue1.isEmpty()){queue2.add(element);return;}//2為空,1有數據,放入1if(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());}
}
?