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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

http://blog.csdn.net/z84616995z/article/details/19204529

兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列:

原理方法:用一個(gè)棧為主棧,一個(gè)棧為輔助棧存放臨時(shí)元素。

入隊(duì):將元素依次壓入主棧

出隊(duì):先檢測輔助棧是否為空,如果非空,那么直接彈出輔助棧頂元素,相當(dāng)于出隊(duì)。如果為空,那么將主棧元素倒入到輔助棧中,然后彈出輔助棧頂元素。達(dá)到先進(jìn)先出的目的。

以下是代碼:

[cpp]?view plain?copy
  • //兩個(gè)個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列??
  • /*#include?<iostream>??
  • #include?<time.h>??
  • #include?<windows.h>??
  • using?namespace?std;??
  • #define?MAX?10??
  • struct?stack??
  • {??
  • ????int?Array[MAX];??
  • ????int?top;??
  • };??
  • struct?stack?s1,s2;??
  • //初始化一個(gè)空棧??
  • int?Init_Stack()??
  • {??
  • ????s1.top=s2.top?=?-1;//top為-1表示空棧??
  • ????return?1;??
  • }??
  • //入隊(duì)??
  • void?enqueue(int?Array[],int?x)??
  • {??
  • ????if?(s1.top==MAX-1)//檢測是否棧已滿??
  • ????{??
  • ????????cout<<"overflow!"<<endl;??
  • ????}???
  • ????else??
  • ????{??
  • ????????s1.top++;??
  • ????????s1.Array[s1.top]=x;//將元素壓入主棧??
  • ????}??
  • }??
  • //出隊(duì)??
  • int?dequeue()??
  • {??
  • ????if?(s1.top==-1&&s2.top==-1)//如果主棧和輔助棧都是空的,那么就出現(xiàn)下溢。提示錯(cuò)誤后返回??
  • ????{??
  • ????????cout<<"underflow!"<<endl;??
  • ????????return?-1;??
  • ????}??
  • ???if?(s2.top==-1)//如果輔助棧為空,那么就循環(huán)地將主棧元素倒入輔助棧??
  • ???{??
  • ??????for?(int?i=s1.top;i>0;i--)??
  • ??????{??
  • ??????????s1.top--;s2.top++;??
  • ??????????s2.Array[s2.top]=s1.Array[s1.top+1];??
  • ??????}??
  • ??????s1.top--;??
  • ??????return?s1.Array[s1.top+1];//返回主棧最后一個(gè)元素作為出隊(duì)元素??
  • ???}???
  • ???else?//如果輔助棧不空,那么直接彈出輔助棧棧頂元素作為出隊(duì)元素??
  • ???{??
  • ???????s2.top--;??
  • ???????return?s2.Array[s2.top+1];??
  • ???}??
  • }??
  • void?main()??
  • {??
  • ????int?x=0;??
  • ????Init_Stack();??
  • ????srand(?(unsigned)time(?NULL?)?);??
  • ????cout<<"數(shù)組中的數(shù)據(jù)入隊(duì)中。。。";??
  • ????for(?int?j=0;?j?<=?100;?j++?)??????//?打印百分比???
  • ????{??
  • ????????cout.width(3);??
  • ????????cout?<<?j?<<?"%";??
  • ????????Sleep(40);??
  • ????????cout?<<?"\b\b\b\b";//\b退格符號(hào)??
  • ????}??
  • ????????cout?<<?"\n\n";??
  • ????cout<<"Array=";??
  • ????for?(int?i=0;i<MAX;i++)??
  • ????{??
  • ????????x=rand()%100;??
  • ????????cout<<x<<"?";??
  • ????????enqueue(s1.Array,x);??
  • ????}??
  • ????cout<<endl;??
  • ????cout<<"所有數(shù)據(jù)入隊(duì)完畢!"<<endl;??
  • ????cout<<endl;??
  • ????cout<<"數(shù)組中的數(shù)據(jù)出隊(duì)中。。。";??
  • ????for(??j=0;?j?<=?100;?j++?)??????//?打印百分比???
  • ????{??
  • ????????cout.width(3);??
  • ????????cout?<<?j?<<?"%";??
  • ????????Sleep(40);??
  • ????????cout?<<?"\b\b\b\b";//\b退格符號(hào)??
  • ????}??
  • ????cout?<<?"\n\n";??
  • ????cout<<"Array=";??
  • ????for?(?i=0;i<MAX;i++)??
  • ????{??
  • ????????cout<<dequeue()<<"?";??
  • ????}??
  • ????cout<<endl;??
  • ????cout<<"所有數(shù)據(jù)出隊(duì)完畢!"<<endl;??
  • ????cout<<endl;??
  • ????enqueue(s1.Array,?56);??
  • ????cout<<dequeue()<<endl;??
  • ????cout<<dequeue()<<endl;??
  • ????cout<<dequeue()<<endl;??
  • ????enqueue(s1.Array,?65);??
  • ????enqueue(s1.Array,?10);??
  • ????enqueue(s1.Array,?32);??
  • ????cout<<dequeue()<<endl;??
  • ????cout<<dequeue()<<endl;??
  • ????enqueue(s1.Array,?2);??
  • ????cout<<dequeue()<<endl;????????
  • }??
  • 運(yùn)行時(shí)間為O(n),在進(jìn)行倒入操作時(shí)需要循環(huán)倒入,所以時(shí)間為n


    兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)棧:

    原理方法:用一個(gè)隊(duì)列為主隊(duì)列,一個(gè)隊(duì)列為輔助隊(duì)列存放臨時(shí)元素。

    入棧:將元素依次壓入主隊(duì)列

    出棧:先將擁有n個(gè)元素的主隊(duì)列的其中的n-1個(gè)元素倒入輔助隊(duì)列,然后將原主隊(duì)列的最后剩下的一個(gè)元素彈出隊(duì)列,相當(dāng)于出棧,這個(gè)時(shí)候,輔助隊(duì)列和主隊(duì)列進(jìn)行交換,繼續(xù)進(jìn)行剛才的出棧操作。

    [cpp]?view plain?copy
  • //兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)棧??
  • #include?<iostream>??
  • #include?<time.h>??
  • #include?<windows.h>??
  • using?namespace?std;??
  • #define?MAX?10???
  • struct?queue??
  • {??
  • ????int?head;//聲明隊(duì)頭指針??
  • ????int?tail;//聲明隊(duì)尾指針??
  • ????int?length;//聲明隊(duì)列當(dāng)前含有的元素個(gè)數(shù)??
  • ????int?Array[MAX];//聲明數(shù)組所能容納的最大元素個(gè)數(shù)??
  • };??
  • struct?queue?q1,q2;?//聲明兩個(gè)隊(duì)列結(jié)構(gòu)體全局變量??
  • void?Init_queue(struct?queue?&q1)//初始化隊(duì)列??
  • {??
  • ????q1.head=q1.tail=1;//隊(duì)列初始時(shí)是從數(shù)組Array[1]開始的,所以其實(shí)Array[0]是數(shù)組最后一個(gè)元素,而不是Array[MAX-1]!這是需要注意的。??
  • ????q1.length=1;??
  • }??
  • //入棧??
  • int?push(int?Array[],int?x)??
  • {??
  • ???if?(q1.head==q1.tail+1)//進(jìn)行入隊(duì)操作的前提判斷是否隊(duì)列已滿??
  • ???{??
  • ???????cerr<<"overflow!"<<endl;//若已滿,那么提示錯(cuò)誤后返回。??
  • ???????return?-1;??
  • ???}??
  • ???else??
  • ???{??
  • ???????if?(q1.length==0)//恢復(fù)隊(duì)列中沒有元素時(shí)的初始值q1.length=1;??
  • ???????{??
  • ???????????q1.length++;q2.length++;??
  • ???????}??
  • ???????q1.length++;q2.length++;//每次入隊(duì)數(shù)組元素個(gè)數(shù)+1??
  • ???????if?(q1.tail==q1.length)//隊(duì)尾指針既然已經(jīng)指向當(dāng)前數(shù)組最后一個(gè)元素的下一個(gè)位置??
  • ???????{??
  • ???????????q1.tail=0;//那么元素只能插入Array[0]最后一個(gè)元素,原因在Init_queue函數(shù)注釋中。??
  • ???????????q1.Array[q1.tail]=x;??
  • ???????}???
  • ???????else??
  • ???????{??
  • ???????????q1.Array[q1.tail]=x;??
  • ???????????q1.tail++;??
  • ???????????if?(q1.tail==MAX)//若隊(duì)尾指針指向數(shù)組最后一個(gè)元素的下一個(gè)位置??
  • ???????????{??
  • ???????????????q1.length--;q2.length--;//由于兩個(gè)隊(duì)列元素個(gè)數(shù)是從1開始的,那么主和輔助隊(duì)列元素個(gè)數(shù)已經(jīng)超過MAX,所以需要調(diào)整為MAX,以便下次入隊(duì)時(shí)插入到Array[0]這個(gè)位置??
  • ???????????}??
  • ???????}??
  • ???????return?q1.tail;??
  • ???}??
  • }??
  • //出棧??
  • int?pop()??
  • {??
  • ????int?x=0;??
  • ????if?(q1.length<=0)//如果主隊(duì)列里面有0個(gè)元素,那么說明不能進(jìn)行出隊(duì)(出棧)操作,直接返回錯(cuò)誤提示??
  • ????{??
  • ????????cerr<<"underflow"<<endl;??
  • ????????return?-1;??
  • ????}???
  • ????else??
  • ????{??
  • ????????if?(q1.tail==0)//通常情況需要返回的是隊(duì)頭指針作為出隊(duì)元素,那么這里為什么返回隊(duì)尾指針?因?yàn)槲覀冃枰脙蓚€(gè)隊(duì)列實(shí)現(xiàn)一個(gè)棧,那么有n個(gè)元素的主棧,把n-1個(gè)元素傳遞給輔助隊(duì)列后,最后入隊(duì)的也是將要出棧的元素肯定在主棧隊(duì)尾。??
  • ????????{??
  • ???????????x=q1.Array[q1.tail];//隊(duì)尾指針指向0時(shí)(其實(shí)指向的就是數(shù)組最后一位,因?yàn)槌跏蓟菑?開始的),直接返回Array[0]??
  • ????????}??
  • ????????else??
  • ????????{??
  • ???????????x=q1.Array[q1.tail-1];//隊(duì)尾指針指向其它時(shí),由于隊(duì)尾指針總是指向數(shù)組最后一個(gè)數(shù)據(jù)的下一位,那么需要返回的是數(shù)組最后一個(gè)數(shù)據(jù),所以要-1.??
  • ????????}??
  • ????????while(q1.tail!=q1.head)//隊(duì)頭和隊(duì)尾相等時(shí),說明已經(jīng)遍歷了整個(gè)隊(duì)列,所以退出循環(huán)??
  • ????????{??
  • ??????????????
  • ????????????q2.Array[q2.tail]=q1.Array[q1.head];//將主棧的數(shù)據(jù)傳遞給輔助棧??
  • ????????????if?(q2.tail==MAX)//由于需要循環(huán)遍歷隊(duì)列,所以當(dāng)隊(duì)尾等于數(shù)組所能容納的最大元素個(gè)數(shù)時(shí),隊(duì)尾指針自動(dòng)調(diào)整到數(shù)組第一個(gè)位置。??
  • ????????????{??
  • ????????????????q2.tail=0;??
  • ????????????}??
  • ????????????else??
  • ????????????{??
  • ????????????????q2.tail++;??
  • ????????????}??
  • ????????????if?(q1.head==MAX)//和上面的if-else類似。??
  • ????????????{??
  • ????????????????q1.head=0;??
  • ????????????}??
  • ????????????else??
  • ????????????{??
  • ????????????????q1.head++;??
  • ????????????}??
  • ????????}??
  • ????????if?(q1.tail==0)//如果隊(duì)尾指針等于0,自動(dòng)指向當(dāng)前主隊(duì)列的最后一個(gè)元素的下一個(gè)位置??
  • ????????{??
  • ????????????q1.tail=q1.length;//這樣在下次出隊(duì)時(shí)能夠返回隊(duì)列的最后一個(gè)元素。??
  • ????????}??
  • ????????else??
  • ????????{??
  • ????????????q1.tail--;//如果隊(duì)尾指針不等于0,那么當(dāng)前主隊(duì)列隊(duì)尾下標(biāo)指向下一個(gè)需要出隊(duì)的元素。??
  • ????????}??
  • ????????swap(q1,q2);//原來的主隊(duì)列轉(zhuǎn)換為輔助隊(duì)列,原來的輔助隊(duì)列轉(zhuǎn)換為主隊(duì)列。??
  • ????????q1.tail=q2.tail;//由于轉(zhuǎn)換后,原主隊(duì)列隊(duì)尾下標(biāo)變?yōu)檩o助隊(duì)列隊(duì)尾下標(biāo),所以需要將當(dāng)前輔助隊(duì)列隊(duì)尾下標(biāo)傳遞給主隊(duì)列??
  • ????????q2.head=q2.tail=1;//輔助隊(duì)列里的元素個(gè)數(shù)保持不變,然后其指針恢復(fù)為初始狀態(tài)。由于輔助隊(duì)列只是起到一個(gè)臨時(shí)保存隊(duì)列中數(shù)據(jù)的作用,所以每次主隊(duì)列有元素出隊(duì),就需要初始化輔助隊(duì)列一下。??
  • ????????q1.length--;q2.length--;//每次出隊(duì)后,需要將輔助和主隊(duì)列當(dāng)前擁有的元素個(gè)數(shù)-1.??
  • ????????return?x;//主隊(duì)列隊(duì)尾元素出隊(duì)(相當(dāng)于出棧)??
  • ????}??
  • }??
  • void?swap(struct?queue?&q1,struct?queue?&q2)//輔助隊(duì)列與主隊(duì)列之間轉(zhuǎn)換??
  • {??
  • ??struct?queue?temp;??
  • ??temp=q1;??
  • ??q1=q2;??
  • ??q2=temp;??
  • }??
  • void?main()??
  • {??
  • ????int?x=0;??
  • ????Init_queue(q1);??
  • ????Init_queue(q2);??
  • ????srand(?(unsigned)time(?NULL?)?);??
  • ????cout<<"數(shù)組中的數(shù)據(jù)入棧中。。。";??
  • ????for(?int?j=0;?j?<=?100;?j++?)??????//?這個(gè)循環(huán)就是一個(gè)看起來很酷的小程序,其實(shí)實(shí)際作用沒有。^_^??
  • ????{??
  • ????????cout.width(3);??
  • ????????cout?<<?j?<<?"%";??
  • ????????Sleep(40);??
  • ????????cout?<<?"\b\b\b\b";//\b退格符號(hào)??
  • ????}??
  • ????cout?<<?"\n\n";??
  • ????cout<<"Array=";??
  • ????for?(int?i=0;i<MAX;i++)//對(duì)于開始q1和q2兩個(gè)空棧來說,設(shè)置q1為主棧,q2為輔助棧??
  • ????{??
  • ????????x=rand()%100;??
  • ????????int?t=push(q1.Array,x);??
  • ????????if?(t==-1)//既然隊(duì)列已滿,那么提示不能入棧后,自動(dòng)跳出循環(huán)。??
  • ????????{??
  • ????????????break;??
  • ????????}??
  • ????????if?(q1.tail==0)??
  • ????????{??
  • ????????????cout<<q1.Array[q1.tail]<<"?";??
  • ????????}???
  • ????????else??
  • ????????{??
  • ????????????cout<<q1.Array[q1.tail-1]<<"?";??
  • ????????}??
  • ????}??
  • ????cout<<endl;??
  • ????cout<<"所有數(shù)據(jù)入棧完畢!"<<endl;??
  • ????cout<<endl;??
  • ????cout<<"數(shù)組中的數(shù)據(jù)出棧中。。。";??
  • ????for(??j=0;?j?<=?100;?j++?)??????//?打印百分比???
  • ????{??
  • ????????cout.width(3);??
  • ????????cout?<<?j?<<?"%";??
  • ????????Sleep(40);??
  • ????????cout?<<?"\b\b\b\b";//\b退格符號(hào)??
  • ????}??
  • ????cout?<<?"\n\n";??
  • ????cout<<"Array=";??
  • ????for?(?i=0;i<MAX;i++)??
  • ????{??
  • ????????cout<<pop()<<"?";??
  • ????}??
  • ????cout<<endl;??
  • ????cout<<"所有數(shù)據(jù)出棧完畢!"<<endl;??
  • ????cout<<endl;??
  • }??
  • 運(yùn)行時(shí)間:由于需要將主隊(duì)列循環(huán)倒入到輔助隊(duì)列中,所以總時(shí)間為O(n).



    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。