日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

两个栈实现一个队列/两个队列实现一个栈

發(fā)布時間:2023/11/30 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两个栈实现一个队列/两个队列实现一个栈 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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("隊列已經為空,不能執(zhí)行從隊頭出隊");??
  • ?????????????return?-1;??
  • ?????????}??
  • ???????????
  • ?????}??
  • ???????
  • ?????public?void?stack1ToStack2()//把stack1全部放入stack2??
  • ?????{??
  • ?????????while(!stack1.isEmpty())???
  • ?????????????stack2.push(stack1.pop());??
  • ?????}??
  • ???????
  • ?????public?int?pSize()//隊列size()??
  • ?????{??
  • ?????????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)//棧不為空??
  • ????????{??
  • ????????????//移動一個隊的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());??
  • ????????????}??
  • ????????}??
  • ????}?
  • }


  • 總結

    以上是生活随笔為你收集整理的两个栈实现一个队列/两个队列实现一个栈的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。