生活随笔
收集整理的這篇文章主要介紹了
两个栈实现一个队列/两个队列实现一个栈
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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())?? ?????????????????stack1ToStack2();??? ?????????????return??stack2.pop();?? ??????????????? ?????????}?? ?????????else?? ?????????{?? ?????????????System.out.println("隊列已經為空,不能執(zhí)行從隊頭出隊");?? ?????????????return?-1;?? ?????????}?? ??????????? ?????}?? ??????? ?????public?void?stack1ToStack2()?? ?????{?? ?????????while(!stack1.isEmpty())??? ?????????????stack2.push(stack1.pop());?? ?????}?? ??????? ?????public?int?pSize()?? ?????{?? ?????????return??stack1.size()+stack2.size();?? ?????}?? ? ? } ? ?
2兩個隊列實現一個棧
1.
原理分析:
棧的主要操作有兩個:入棧操作和出棧操作,出棧時從棧頂出,入棧是從棧頂插入。入棧和入隊類似,都是從“所有元素后面插入”;而最關鍵的問題是出棧操作,要出棧的是的棧頂元素,而隊列每次出隊的是隊列的第一個元素。因此我們可以這樣,出隊的時候,若隊列不止一個元素,則進行出隊 操作,只保留最后一個元素,這樣出隊的時候,就符合出棧的要求了,但其他的元素必須 保留,而且順序不能亂,這時候另一個隊列就起作用了,這個隊列可以在“出棧”操作之前按順序保留所有的元素,等到“出棧”之后,把所有元素按順序進入到“出棧”后的隊列。因此兩個隊列總有一個為空。
2.總結操作就是:
入棧:將元素進隊列A
出棧:判斷隊列A中元素的個數是否為1,如果等于1,則出隊列,否則將隊列A中的元素??以此出隊列并放入隊列B,直到隊列A中的元素留下一個,然后隊列A出隊列,再把??隊列B中的元素出隊列以此放入隊列A中。
3.Java代碼實現:
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)?? ????????{?? ?????????????? ????????????if(!queue1.isEmpty())?? ????????????{?? ????????????????putN_1ToAnthor();?? ????????????????return?queue1.removeFirst();?? ????????????}?? ????????????else???? ????????????{?? ????????????????putN_1ToAnthor();?? ????????????????return?queue2.removeFirst();?? ????????????}?????????? ????????}?? ????????else?? ????????{?? ????????????System.out.println("棧已經為空啦,不能出棧");?? ????????????return?-1;?? ????????}?? ?????????? ????}?? ?????? ????public?int?sSize()?? ????{?? ????????return?queue1.size()+queue2.size();?? ????}?? ?????? ????public?void?putN_1ToAnthor()?? ????{?? ????????if(!queue1.isEmpty())?? ????????{?? ????????????while(queue1.size()>1)?? ????????????{?? ????????????????queue2.addLast(queue1.removeFirst());?? ????????????}?? ????????}?? ????????else?if(!queue2.isEmpty())?? ????????{?? ????????????while(queue2.size()>1)?? ????????????{?? ????????????????queue1.addLast(queue2.removeFirst());?? ????????????}?? ????????}?? ????}? }
總結
以上是生活随笔為你收集整理的两个栈实现一个队列/两个队列实现一个栈的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。