生活随笔
收集整理的這篇文章主要介紹了
两个栈实现一个队列与两个队列实现一个栈
小編覺得挺不錯(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 ?? /*#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;?? ?? int?Init_Stack()?? {?? ????s1.top=s2.top?=?-1;?? ????return?1;?? }?? ?? void?enqueue(int?Array[],int?x)?? {?? ????if?(s1.top==MAX-1)?? ????{?? ????????cout<<"overflow!"<<endl;?? ????}??? ????else?? ????{?? ????????s1.top++;?? ????????s1.Array[s1.top]=x;?? ????}?? }?? ?? int?dequeue()?? {?? ????if?(s1.top==-1&&s2.top==-1)?? ????{?? ????????cout<<"underflow!"<<endl;?? ????????return?-1;?? ????}?? ???if?(s2.top==-1)?? ???{?? ??????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];?? ???}??? ???else??? ???{?? ???????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";?? ????}?? ????????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";?? ????}?? ????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 ?? #include?<iostream>?? #include?<time.h>?? #include?<windows.h>?? using?namespace?std;?? #define?MAX?10??? struct?queue?? {?? ????int?head;?? ????int?tail;?? ????int?length;?? ????int?Array[MAX];?? };?? struct?queue?q1,q2;??? void?Init_queue(struct?queue?&q1)?? {?? ????q1.head=q1.tail=1;?? ????q1.length=1;?? }?? ?? int?push(int?Array[],int?x)?? {?? ???if?(q1.head==q1.tail+1)?? ???{?? ???????cerr<<"overflow!"<<endl;?? ???????return?-1;?? ???}?? ???else?? ???{?? ???????if?(q1.length==0)?? ???????{?? ???????????q1.length++;q2.length++;?? ???????}?? ???????q1.length++;q2.length++;?? ???????if?(q1.tail==q1.length)?? ???????{?? ???????????q1.tail=0;?? ???????????q1.Array[q1.tail]=x;?? ???????}??? ???????else?? ???????{?? ???????????q1.Array[q1.tail]=x;?? ???????????q1.tail++;?? ???????????if?(q1.tail==MAX)?? ???????????{?? ???????????????q1.length--;q2.length--;?? ???????????}?? ???????}?? ???????return?q1.tail;?? ???}?? }?? ?? int?pop()?? {?? ????int?x=0;?? ????if?(q1.length<=0)?? ????{?? ????????cerr<<"underflow"<<endl;?? ????????return?-1;?? ????}??? ????else?? ????{?? ????????if?(q1.tail==0)?? ????????{?? ???????????x=q1.Array[q1.tail];?? ????????}?? ????????else?? ????????{?? ???????????x=q1.Array[q1.tail-1];?? ????????}?? ????????while(q1.tail!=q1.head)?? ????????{?? ?????????????? ????????????q2.Array[q2.tail]=q1.Array[q1.head];?? ????????????if?(q2.tail==MAX)?? ????????????{?? ????????????????q2.tail=0;?? ????????????}?? ????????????else?? ????????????{?? ????????????????q2.tail++;?? ????????????}?? ????????????if?(q1.head==MAX)?? ????????????{?? ????????????????q1.head=0;?? ????????????}?? ????????????else?? ????????????{?? ????????????????q1.head++;?? ????????????}?? ????????}?? ????????if?(q1.tail==0)?? ????????{?? ????????????q1.tail=q1.length;?? ????????}?? ????????else?? ????????{?? ????????????q1.tail--;?? ????????}?? ????????swap(q1,q2);?? ????????q1.tail=q2.tail;?? ????????q2.head=q2.tail=1;?? ????????q1.length--;q2.length--;?? ????????return?x;?? ????}?? }?? void?swap(struct?queue?&q1,struct?queue?&q2)?? {?? ??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++?)???????? ????{?? ????????cout.width(3);?? ????????cout?<<?j?<<?"%";?? ????????Sleep(40);?? ????????cout?<<?"\b\b\b\b";?? ????}?? ????cout?<<?"\n\n";?? ????cout<<"Array=";?? ????for?(int?i=0;i<MAX;i++)?? ????{?? ????????x=rand()%100;?? ????????int?t=push(q1.Array,x);?? ????????if?(t==-1)?? ????????{?? ????????????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";?? ????}?? ????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ò),歡迎將生活随笔推薦給好友。