用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列,并實(shí)現(xiàn)兩個(gè)函數(shù)appendTail和deleteHead,分別完成在隊(duì)列尾部插入結(jié)點(diǎn)和在隊(duì)列頭部刪除結(jié)點(diǎn)的功能。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),溆浦企業(yè)網(wǎng)站建設(shè),溆浦品牌網(wǎng)站建設(shè),網(wǎng)站定制,溆浦網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,溆浦網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。棧的特點(diǎn)是“先進(jìn)后出,后進(jìn)先出”,而隊(duì)列的特點(diǎn)是“先進(jìn)先出,后進(jìn)后出”,因此可以想到只用一個(gè)棧是無法完成的,所以會(huì)需要兩個(gè)棧,先將輸入的數(shù)據(jù)都依次放入一個(gè)棧stack1中,但是先進(jìn)去的數(shù)據(jù)會(huì)被壓在棧底,而棧底的數(shù)據(jù)是需要最先被取出的,可畫圖如下:
當(dāng)要完成在隊(duì)列頭部刪除結(jié)點(diǎn)這就要用到另外一個(gè)棧stack2了,可以將第一個(gè)棧stack1的棧頂元素依次取出放進(jìn)另外的棧stack2中,這樣stack1中的棧底元素就變成了stack2中的棧頂元素,當(dāng)需要?jiǎng)h除隊(duì)列頭部結(jié)點(diǎn)的時(shí)候就可以pop出stack2的棧頂元素;
而需要在隊(duì)列尾部插入結(jié)點(diǎn)就往stack1中壓入數(shù)據(jù):
也就是相當(dāng)于,當(dāng)stack2不為空的時(shí)候,要?jiǎng)h除隊(duì)列頭部的結(jié)點(diǎn)就從stack2的棧頂中取出數(shù)據(jù),如果stack2為空的時(shí)候就將stack1中的數(shù)據(jù)全部都從棧頂取出依次放入stack2中,然后再取出stack2的棧頂元素;而要在隊(duì)列尾部插入結(jié)點(diǎn)的時(shí)候就直接往stack1里面push數(shù)據(jù),這并不影響刪除隊(duì)列首部的結(jié)點(diǎn),因?yàn)槊看蝡ush數(shù)據(jù)都往stack1里面放,而當(dāng)stack2不為空的時(shí)候從stack2中pop數(shù)據(jù),二者并不影響;
程序如下:
#include <iostream> #include <vector> using namespace std; template <class T> class Queue { private: vector<T> _stack1; //定義隊(duì)列的成員變量直接使用庫類vector vector<T> _stack2; public: Queue() //直接用類的默認(rèn)構(gòu)造函數(shù),這里會(huì)自動(dòng)調(diào)用庫vector中的構(gòu)造函數(shù)創(chuàng)建兩個(gè)棧 {} //當(dāng)需要向隊(duì)列尾部放數(shù)據(jù)的時(shí)候,直接在棧1中push數(shù)據(jù)就可以了 void appendTail(T data) { _stack1.push_back(data); } //當(dāng)要?jiǎng)h除隊(duì)列頭部的數(shù)據(jù)的時(shí)候 void deleteHead() { //先要判斷棧2中是否有數(shù)據(jù),如果有就直接取出棧頂?shù)脑?,此時(shí)就為隊(duì)首的數(shù)據(jù) if(!_stack2.empty()) { _stack2.pop_back(); } else//若棧2為空,則需要將棧1中的數(shù)據(jù)調(diào)換到棧2中,以保證先進(jìn)棧1的數(shù)據(jù)放在棧2的頂部 { while(!_stack1.empty()) { _stack2.push_back(_stack1.back()); _stack1.pop_back(); } if(!_stack2.empty()) _stack2.pop_back(); else { cout<<"the queue is empty..."<<endl; return; } } cout<<"the new head is "<<_stack2.back()<<endl; } //為了觀察方便,這里定義一個(gè)打印隊(duì)列的函數(shù),這個(gè)函數(shù)其實(shí)也就是在完成兩個(gè)棧實(shí)現(xiàn)隊(duì)列的過程 void print_queue() { //這里要注意的是不能直接使用對(duì)象的成員變量stack1和stack2,因?yàn)檫@樣會(huì)更改對(duì)象的數(shù)據(jù),而 //我們只是需要打印數(shù)據(jù)并不希望更改它,因此可以使用vector庫中的拷貝構(gòu)造函數(shù)再構(gòu)造出 //兩個(gè)臨時(shí)棧 vector<T> tmp1(_stack1); vector<T> tmp2(_stack2); cout<<"head "; if(tmp2.empty())//當(dāng)棧2為空的時(shí)候需要將棧1的數(shù)據(jù)挪到棧2再取出 { while(!tmp1.empty()) { tmp2.push_back(tmp1.back()); tmp1.pop_back(); } while(!tmp2.empty()) { cout<<tmp2.back()<<" "; tmp2.pop_back(); } } else { //當(dāng)棧2不為空的時(shí)候先取出棧2的數(shù)據(jù),然后再將棧1的數(shù)據(jù)放入棧2再取出 while(!tmp2.empty()) { cout<<tmp2.back()<<" "; tmp2.pop_back(); if(tmp2.empty()) { while(!tmp1.empty()) { tmp2.push_back(tmp1.back()); tmp1.pop_back(); } } } } cout<<"tail"<<endl; } }; int main() { Queue<char> queue; queue.appendTail('a'); queue.appendTail('b'); queue.appendTail('c'); queue.appendTail('d'); queue.appendTail('e'); queue.print_queue(); queue.deleteHead(); queue.deleteHead(); queue.print_queue(); queue.appendTail('f'); queue.appendTail('g'); queue.appendTail('h'); queue.print_queue(); return 0; }
因?yàn)樯厦娴年?duì)類是模板類,因此實(shí)現(xiàn)了代碼復(fù)用,隊(duì)中的數(shù)據(jù)可以為任意類型;
運(yùn)行程序:
《完》
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。
網(wǎng)站標(biāo)題:用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列——7-創(chuàng)新互聯(lián)
分享地址:http://www.rwnh.cn/article10/cejdgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、定制網(wǎng)站、微信小程序、品牌網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容