兩個棧實現一個隊列/兩個隊列實現一個棧

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代碼實現

  1. import?java.util.Stack;??
  2. ??
  3. public?class?StacksToQueue???
  4. {??
  5. ?????Stack<Integer>?stack1=new?Stack<Integer>()?;??
  6. ?????Stack<Integer>?stack2=new?Stack<Integer>();??
  7. ?????public?void?addToTail(int?x)//添加元素到隊尾???--進隊---??
  8. ?????{??
  9. ?????????stack1.push(x);??
  10. ???????????
  11. ?????}??
  12. ?????public?int?deleteHead()//刪除對首??????--出隊---????不需是隊不為空才能刪除呀~~~~??
  13. ?????{??
  14. ?????????if(?pSize()!=0)//隊列不為空??
  15. ?????????{??
  16. ?????????????if(stack2.isEmpty())//若stack2為空,則把stack1全部加入stack2??
  17. ?????????????????stack1ToStack2();???
  18. ?????????????return??stack2.pop();??
  19. ???????????????
  20. ?????????}??
  21. ?????????else??
  22. ?????????{??
  23. ?????????????System.out.println("隊列已經為空,不能執行從隊頭出隊");??
  24. ?????????????return?-1;??
  25. ?????????}??
  26. ???????????
  27. ?????}??
  28. ???????
  29. ?????public?void?stack1ToStack2()//把stack1全部放入stack2??
  30. ?????{??
  31. ?????????while(!stack1.isEmpty())???
  32. ?????????????stack2.push(stack1.pop());??
  33. ?????}??
  34. ???????
  35. ?????public?int?pSize()//隊列size()??
  36. ?????{??
  37. ?????????return??stack1.size()+stack2.size();//兩個都為空隊列才是空??
  38. ?????}??
  39. ? ?
  40. } ? ?


2兩個隊列實現一個棧

1.原理分析:
棧的主要操作有兩個:入棧操作和出棧操作,出棧時從棧頂出,入棧是從棧頂插入。入棧和入隊類似,都是從“所有元素后面插入”;而最關鍵的問題是出棧操作,要出棧的是的棧頂元素,而隊列每次出隊的是隊列的第一個元素。因此我們可以這樣,出隊的時候,若隊列不止一個元素,則進行出隊 操作,只保留最后一個元素,這樣出隊的時候,就符合出棧的要求了,但其他的元素必須 保留,而且順序不能亂,這時候另一個隊列就起作用了,這個隊列可以在“出棧”操作之前按順序保留所有的元素,等到“出棧”之后,把所有元素按順序進入到“出棧”后的隊列。因此兩個隊列總有一個為空。

2.總結操作就是:

入棧:將元素進隊列A

出棧:判斷隊列A中元素的個數是否為1,如果等于1,則出隊列,否則將隊列A中的元素??以此出隊列并放入隊列B,直到隊列A中的元素留下一個,然后隊列A出隊列,再把??隊列B中的元素出隊列以此放入隊列A中。


3.Java代碼實現:
  1. import?java.util.LinkedList;??
  2. ??
  3. public?class?QueuesToStack???
  4. {??
  5. ????LinkedList<Integer>?queue1=new?LinkedList<Integer>();??
  6. ????LinkedList<Integer>?queue2=new?LinkedList<Integer>();??
  7. ????public?void?push(int?value)//入棧??
  8. ????{??
  9. ????????queue1.addLast(value);??
  10. ??????????
  11. ????}??
  12. ??????
  13. ????public?int?pop()//出棧?????必須是非空的棧才能出棧啊??
  14. ????{??
  15. ????????if(sSize()!=0)//棧不為空??
  16. ????????{??
  17. ????????????//移動一個隊的n-1個到另一個中??
  18. ????????????if(!queue1.isEmpty())//q1?空??
  19. ????????????{??
  20. ????????????????putN_1ToAnthor();??
  21. ????????????????return?queue1.removeFirst();??
  22. ????????????}??
  23. ????????????else??//q2?空??
  24. ????????????{??
  25. ????????????????putN_1ToAnthor();??
  26. ????????????????return?queue2.removeFirst();??
  27. ????????????}??????????
  28. ????????}??
  29. ????????else??
  30. ????????{??
  31. ????????????System.out.println("棧已經為空啦,不能出棧");??
  32. ????????????return?-1;??
  33. ????????}??
  34. ??????????
  35. ????}??
  36. ??????
  37. ????public?int?sSize()??
  38. ????{??
  39. ????????return?queue1.size()+queue2.size();??
  40. ????}??
  41. ??????
  42. ????public?void?putN_1ToAnthor()//從非空中出隊n-1個到另一個隊列???因為隊列總是一空一非空??
  43. ????{??
  44. ????????if(!queue1.isEmpty())??
  45. ????????{??
  46. ????????????while(queue1.size()>1)??
  47. ????????????{??
  48. ????????????????queue2.addLast(queue1.removeFirst());??
  49. ????????????}??
  50. ????????}??
  51. ????????else?if(!queue2.isEmpty())??
  52. ????????{??
  53. ????????????while(queue2.size()>1)??
  54. ????????????{??
  55. ????????????????queue1.addLast(queue2.removeFirst());??
  56. ????????????}??
  57. ????????}??
  58. ????}?
  59. }


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383996.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383996.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383996.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UVa1588

【題目描述】 傳送門 【題目分析】 剛開始想了一會沒有想到什么很好的算法&#xff0c;看到了長度最多為100&#xff0c;就知道自己想的沒有什么意義了&#xff0c;直接暴力&#xff0c;把每一種填法都試一下就知道了。適當剪枝一下&#xff08;一個簡單的樂觀函數&#xff…

轉:C++中const、volatile、mutable的用法

const修飾普通變量和指針 const修飾變量&#xff0c;一般有兩種寫法&#xff1a; const TYPE value; TYPE const value; 這兩種寫法在本質上是一樣的。它的含義是&#xff1a;const修飾的類型為TYPE的變量value是不可變的。對于一個非指針的類型TYPE&#xff0c;無論怎么寫&…

數據鏈路

廣播信道的數據鏈路層 局域網的優點 網絡為一個單位所擁有, 地理范圍和站點數有限 局域網具有廣播特性, 可以從一個站點方便地訪問到整個網絡. 各個主機之間可以共享資源, 無論是局域網上的硬件資源還是局域網上的軟件資源 便于系統的擴展換和演化, 各個設備之間的位置可靈…

UVa11809

【題目描述】 傳送門 【題目分析】 終于把這道題做完了&#xff0c;之前一直連題意都看不懂。實在不行上網找了一下大佬的博客&#xff0c;看懂題意后自己寫&#xff0c;發現讀入很難處理&#xff0c;就又學習了一下大佬的讀入方法&#xff0c;用的是C里面的sstream&#xf…

數據鏈路層:基本概念

數據鏈路層的定義 對數據鏈路層有對上的網絡層接口. 對下提供物理層的接口. 定義合適的傳輸差錯率 對傳輸流進行管理, 以免快速的傳輸的數據被淹沒. 比如發送端發送信號太快, 接受方接受速度較慢, 此時數據鏈路層就需要提供一定的功能解決這個問題 物理層上傳輸的基本單元是…

C++的沉迷與愛戀

每年的 09/28 於我都是一個特殊的日子 -- 不只是因為教師節。今年很特殊地沒有普天同慶&#xff0c;那麼我就寫篇文章自己慶祝一下好了。我於今年七月發表了一本著作《多型與虛擬》和一本譯作《深度探索C物件模型》&#xff0c;獲得很大的回響。這些作品都不是針對 C 的完全初學…

Insertion Sort——打表找規律

【題目描述】 Insertion sort is a simple sorting algorithm that builds the final sorted array one item at an iteration.More precisely, insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. At each iteration…

數據鏈路層: 可靠性傳輸 六個協議

可靠性傳輸 1. 差錯控制 發送方將數據幀發送, 但是當發送方發送的是一個 1的時候此時接受方卻接受的是一個 0. (1)校驗 接收方如果幀校驗接受到的幀沒有問題, 則對發送方發送一個肯定性的確認, 當對這個數據幀進行校驗發現這個幀有問題的時候, 此時接受方一種是將這個數據幀…

c語言實現配置文件的讀寫

配置文件的格式如下&#xff1a; key1 value1 key2 value2 . . . 名值對以一個鏈接&#xff0c;一條記錄以換行符分割 頭文件&#xff1a; #include<stdio.h> #include<stdlib.h> #include <string.h> 函數原型&#xff1a; void trim(char *strIn, char *…

Educational Codeforces Round 73 (Rated for Div. 2)

A 很簡單的一個模擬&#xff0c;只要前面的數字有兩個以上就能合成后面的&#xff0c;我們進行一遍合成看能不能出現2048就可以了。 #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include&…

數據鏈路層: HDLC

一. 協議機 發送方和接收方. 同時有限狀態機把協議形式化為一個四元組 (S,M,I,T), 其中你S表示進程和信道可能進入的集合, M 表示數據幀的狀態, I 表示進程的初始狀態, T 表示兩兩狀態之間的轉化. 每個系統狀態可以分為發送狀態, 接受狀態和信道狀態. 把狀態用一個點進行表示,…

Miller_Rabin算法

為了測試一個大整數是不是素數&#xff0c;我們不能夠使用傳統的測試是否有因子的方法&#xff0c;因為那樣的時間復雜度至少也是O(n)O(n)O(n)&#xff0c;空間復雜度是O(n)O(n)O(n)&#xff08;使用線性篩數法&#xff09;&#xff0c;時間復雜度還好說&#xff0c;空間復雜度…

bob-tong 字符串函數之Strtok()函數

https://www.cnblogs.com/Bob-tong/p/6610806.html Strtok()函數詳解&#xff1a; 該函數包含在"string.h"頭文件中 函數原型&#xff1a; char* strtok (char* str,constchar* delimiters ); 函數功能&#xff1a; ??切割字符串&#xff0c;將str切分成一個個子…

數據鏈路層:SLIP(串型線路IP) PPP(點對點協議)

SLIP 沒有差錯控制, 傳輸時必須知道對方IP, 傳輸使用于低速業務 19.2k.應用非常受限 PPP協議 1. PPP協議功能 處理錯誤檢測 支持多協議(IP, IPX, DECnet 等) 連接時允許協商 IP 地址 允許身份驗證 2. PPP 的組成 串型鏈路上封裝數據報, 即支持異步鏈路也支持面向 比特…

Honeycomb——BFS

【題目描述】 傳送門 【題目分析】 看起來很復雜好像還要建圖什么的&#xff0c;其實直接在原圖上BFS就可以了&#xff0c;設置一下方向數組&#xff0c;然后直接跑就可以了。 【AC代碼】 #include<cstdio> #include<cstring> #include<algorithm> #inc…

C語言中strspn()函數和strcspn()函數的對比使用

C語言strspn()函數&#xff1a;計算字符串str中連續有幾個字符都屬于字符串accept 頭文件&#xff1a;#include <string.h> strspn() 函數用來計算字符串 str 中連續有幾個字符都屬于字符串 accept&#xff0c;其原型為&#xff1a; size_t strspn(const char *str, con…

Codeforces Round #587 (Div. 3)

A 只要每兩個都不一樣就可以&#xff0c;一旦出現兩個一樣的就改一個。 #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype> #include<queue> #include<set>using namespace std;typede…

信道分配 以太網

1.頻分復用 將信道分為多個頻帶, 用戶得到某個頻帶后,在通信的過程中, 自始至終都都占用這個信道.即頻分復用中, 所有用戶同時占用不同頻帶的信道 2. 時分信道 將時間劃分為一段一段的等長時分復用幀, 每個用戶在不同時間占用相同的數據幀 3. CSMA/CD 載波監聽多點接入/碰撞…

strpbrk函數

http://blog.csdn.net/tommy_wxie/article/details/7554332 函數原型&#xff1a;extern char *strpbrk(char *str1, char *str2) 參數說明&#xff1a;str1待比較的字符串&#xff0c;str2為指定被搜索的字符串。 所在庫名&#xff1a;#include <string.h> …

網絡層網絡層服務及其 IP 地址

ARP 協議功能 將 IP 地址通過廣播(一個網段, 不能跨路由器), 目標 MAC 地址是FFFFFFFF 解析目標IP地址的 MAC 地址. IP 協議 網絡層的一個協議, 是一個協議的統稱, 包括 ARP(地址解析協議) 協議, ICMP(網絡控制報文協議) 協議, IGMP(網際組管理協議) 協議. 其中 ICMP 和 IG…