http://blog.csdn.net/sinat_30472685/article/details/70157227
1兩個棧實現一個隊列
1.原理分析:
隊列的主要操作有兩個:入隊操作和出隊操作,出隊時從隊頭出,入隊是從隊尾插入,入隊的操作和入棧的操作類似,而最關鍵的問題是出隊操作,要出隊列的是隊列的第一個元素,而出棧的是棧的棧頂元素,所以我們可以這樣:
? ? ? ?假設兩個棧A和棧B,A主要用來處理入隊操作,B用于處理出隊操作。入隊操作和入棧操作類似,直接將元素壓入棧即可。出隊的時候,實現我們假設棧B為空,則要把棧A的第一個元素(即棧底元素)彈出,直接從A彈出這是不可能的,但如果我們把棧A里面的元素的順序逆過來,這樣直接用棧彈出棧頂元素即可,所以我們可以把棧A的元素全部彈出來,并俺順序壓入棧B中,這樣每次棧B彈出的棧頂元素就是棧A相對應的棧底元素,就是出隊操作。若B不為空,則代表之前從A復制過來的元素還沒有完全彈出,要出棧的時候直接彈出即可。若棧B的元素都彈出來了,就需要從A中補充。
?2.總結操作就是: ? ?
入隊:將元素進棧A
出隊:判斷棧B是否為空,如果為空,則將棧A中所有元素pop,并push進棧B,棧B出棧;如果不為空,棧B直接出棧。
3.Java代碼實現
- import?java.util.Stack;??
- ??
- public?class?StacksToQueue???
- {??
- ?????Stack<Integer>?stack1=new?Stack<Integer>()?;??
- ?????Stack<Integer>?stack2=new?Stack<Integer>();??
- ?????public?void?addToTail(int?x)//添加元素到隊尾???--進隊---??
- ?????{??
- ?????????stack1.push(x);??
- ???????????
- ?????}??
- ?????public?int?deleteHead()//刪除對首??????--出隊---????不需是隊不為空才能刪除呀~~~~??
- ?????{??
- ?????????if(?pSize()!=0)//隊列不為空??
- ?????????{??
- ?????????????if(stack2.isEmpty())//若stack2為空,則把stack1全部加入stack2??
- ?????????????????stack1ToStack2();???
- ?????????????return??stack2.pop();??
- ???????????????
- ?????????}??
- ?????????else??
- ?????????{??
- ?????????????System.out.println("隊列已經為空,不能執行從隊頭出隊");??
- ?????????????return?-1;??
- ?????????}??
- ???????????
- ?????}??
- ???????
- ?????public?void?stack1ToStack2()//把stack1全部放入stack2??
- ?????{??
- ?????????while(!stack1.isEmpty())???
- ?????????????stack2.push(stack1.pop());??
- ?????}??
- ???????
- ?????public?int?pSize()//隊列size()??
- ?????{??
- ?????????return??stack1.size()+stack2.size();//兩個都為空隊列才是空??
- ?????}??
- ? ?
- } ? ?
2兩個隊列實現一個棧
入棧:將元素進隊列A
出棧:判斷隊列A中元素的個數是否為1,如果等于1,則出隊列,否則將隊列A中的元素??以此出隊列并放入隊列B,直到隊列A中的元素留下一個,然后隊列A出隊列,再把??隊列B中的元素出隊列以此放入隊列A中。
- import?java.util.LinkedList;??
- ??
- public?class?QueuesToStack???
- {??
- ????LinkedList<Integer>?queue1=new?LinkedList<Integer>();??
- ????LinkedList<Integer>?queue2=new?LinkedList<Integer>();??
- ????public?void?push(int?value)//入棧??
- ????{??
- ????????queue1.addLast(value);??
- ??????????
- ????}??
- ??????
- ????public?int?pop()//出棧?????必須是非空的棧才能出棧啊??
- ????{??
- ????????if(sSize()!=0)//棧不為空??
- ????????{??
- ????????????//移動一個隊的n-1個到另一個中??
- ????????????if(!queue1.isEmpty())//q1?空??
- ????????????{??
- ????????????????putN_1ToAnthor();??
- ????????????????return?queue1.removeFirst();??
- ????????????}??
- ????????????else??//q2?空??
- ????????????{??
- ????????????????putN_1ToAnthor();??
- ????????????????return?queue2.removeFirst();??
- ????????????}??????????
- ????????}??
- ????????else??
- ????????{??
- ????????????System.out.println("棧已經為空啦,不能出棧");??
- ????????????return?-1;??
- ????????}??
- ??????????
- ????}??
- ??????
- ????public?int?sSize()??
- ????{??
- ????????return?queue1.size()+queue2.size();??
- ????}??
- ??????
- ????public?void?putN_1ToAnthor()//從非空中出隊n-1個到另一個隊列???因為隊列總是一空一非空??
- ????{??
- ????????if(!queue1.isEmpty())??
- ????????{??
- ????????????while(queue1.size()>1)??
- ????????????{??
- ????????????????queue2.addLast(queue1.removeFirst());??
- ????????????}??
- ????????}??
- ????????else?if(!queue2.isEmpty())??
- ????????{??
- ????????????while(queue2.size()>1)??
- ????????????{??
- ????????????????queue1.addLast(queue2.removeFirst());??
- ????????????}??
- ????????}??
- ????}?
- }