使用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列
創(chuàng)新互聯(lián)建站是一家以網(wǎng)絡(luò)技術(shù)公司,為中小企業(yè)提供網(wǎng)站維護(hù)、網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站備案、服務(wù)器租用、域名注冊(cè)、軟件開發(fā)、重慶小程序開發(fā)等企業(yè)互聯(lián)網(wǎng)相關(guān)業(yè)務(wù),是一家有著豐富的互聯(lián)網(wǎng)運(yùn)營(yíng)推廣經(jīng)驗(yàn)的科技公司,有著多年的網(wǎng)站建站經(jīng)驗(yàn),致力于幫助中小企業(yè)在互聯(lián)網(wǎng)讓打出自已的品牌和口碑,讓企業(yè)在互聯(lián)網(wǎng)上打開一個(gè)面向全國(guó)乃至全球的業(yè)務(wù)窗口:建站咨詢電話:028-86922220
思路一:
我們?cè)O(shè)定s1是入棧的,s2是出棧的。
入隊(duì)列,直接壓到s1即可
出隊(duì)列,先把s1中的元素倒入到s2中,彈出s2中的棧頂元素;再把s2的剩余元素全部倒回s1中。
缺點(diǎn):
每次只要出棧一個(gè)元素就要將元素倒來(lái)倒去,麻煩?。?!
思路2:
入隊(duì)列時(shí):
如果s1為空,把s2中所有的元素倒出壓到s1中。否則直接壓入s1
出隊(duì)列時(shí):
如果s2不為空,把s2中的棧頂元素直接彈出。否則,把s1的所有元素全部彈出壓入s2中,再?gòu)棾鰏2的棧頂元素
思路1無(wú)條件地每次都要將元素倒來(lái)倒去,思路2出隊(duì)時(shí)較思路1簡(jiǎn)單
思路3:
我們?cè)O(shè)定s1是入棧的,s2是出棧的
入隊(duì)列:直接壓入元素至s1即可
出隊(duì)列:如果s2不為空,把s2中的棧頂元素直接彈出。否則,把s1的所有元素全部彈出壓入s2中,再?gòu)棾鰏2的棧頂元素
相比于方法2,入隊(duì)直接壓入即可~
那么,我們可以看出,思路三最簡(jiǎn)單,我們下面看下代碼。
代碼實(shí)現(xiàn):
1)我們直接調(diào)用庫(kù)里的stack來(lái)實(shí)現(xiàn)。(一般調(diào)用庫(kù)里的就行了)
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; //兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列 #include<stack> template<class T> class Queue { public: void appendTail(const T& x) { s1.push(x); } void deleteHead() { if (s2.empty()) { while (!s1.empty()) { s2.push(s1.top()); s1.pop(); } cout << s2.top() << " "; s2.pop(); } else { cout << s2.top() << " "; s2.pop(); } } private: stack<T> s1; stack<T> s2; }; void Test() { Queue<int> q; q.appendTail(1); q.appendTail(2); q.appendTail(3); q.appendTail(4); q.deleteHead(); q.deleteHead(); q.deleteHead(); q.deleteHead(); } int main() { Test(); system("pause"); return 0; }
2)自己實(shí)現(xiàn)棧實(shí)現(xiàn)。
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; #include<assert.h> //直接實(shí)現(xiàn)Stack,也可以用適配器實(shí)現(xiàn)棧,或者用庫(kù)。 //將Stack基本功能實(shí)現(xiàn)如下: template<class T> class Stack { public: Stack() :_array(NULL) , _size(0) , _capacity(0) {} Stack<T>(const Stack<T>& s) : _array(new T[s._capacity]) { swap(_array, s._array); swap(_size, s._size); swap(_capacity, s._capacity); } Stack<T>& operator=(const Stack<T>& s) { if (&s != this) { swap(_array, s._array); swap(_size, s._size); swap(_capacity, s._capacity); } return *this; } ~Stack() { if (_array) { delete[] _array; _array = NULL; } } void _CheckCapacity() { if (_size == 0) { _capacity = 3; _array = new T[_capacity]; } if (_size >= _capacity) { _capacity *= 2; T* tmp = new T[_capacity]; for (int index = 0; index < _size; index++) { tmp[index] = _array[index]; } delete[] _array; _array = tmp; } } void Push(const T& x) { _CheckCapacity(); _array[_size++] = x; } void Pop() { if (_size == 0) { return; } --_size; } size_t Size() { return _size; } bool Empty() { return Size() == 0; } T& Top() { assert(_size > 0); return _array[_size - 1]; } private: T* _array; size_t _size; size_t _capacity; }; template<class T> class Queue { public: void InQueue(const T& x) { s1.Push(x); } void OutQueue() { //棧s2為空,則將棧s1的元素全部倒入s2中,再?gòu)棾鲎钌厦娴哪莻€(gè)元素 if (s2.Empty()) { while (!s1.Empty()) { s2.Push(s1.Top()); s1.Pop(); } s2.Pop(); } //棧s2不為空,直接彈出元素 else { s2.Pop(); } } void Print() //打印隊(duì)列元素,分四種情況。 { if (s1.Empty() && s2.Empty()) { cout << "The Queue is Empty!"; } else if (!s1.Empty() && s2.Empty()) { while (!s1.Empty()) { s2.Push(s1.Top()); s1.Pop(); } while (!s2.Empty()) { cout << s2.Top() << " "; s2.Pop(); } } else if (s1.Empty() && !s2.Empty()) { while (!s2.Empty()) { cout << s2.Top() << " "; s2.Pop(); } } else { while (!s2.Empty()) { cout << s2.Top() << " "; s2.Pop(); } while (!s1.Empty()) { s2.Push(s1.Top()); s1.Pop(); } while (!s2.Empty()) { cout << s2.Top() << " "; s2.Pop(); } } cout << endl; } private: Stack<T> s1; //入隊(duì) Stack<T> s2; //出隊(duì) }; //測(cè)試兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列 void Test1() { Queue<int> q1; q1.InQueue(1); q1.InQueue(2); q1.InQueue(3); q1.InQueue(4); /*q1.Print();*/ q1.OutQueue(); /*q1.Print();*/ q1.InQueue(5); q1.InQueue(6); q1.InQueue(7); q1.Print(); } int main() { Test1(); system("pause"); return 0; }
(1個(gè)細(xì)節(jié)):
注意再將元素倒入另一個(gè)棧時(shí),代碼并不是先pop,再push。因?yàn)檫@樣push后元素就找不到了。因此要先訪問(wèn)到棧頂元素top,再push,而后pop。
本文標(biāo)題:【數(shù)據(jù)結(jié)構(gòu)】(面試題)使用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列(詳細(xì)介紹)
文章分享:http://aaarwkj.com/article26/isjijg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、微信公眾號(hào)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、商城網(wǎng)站、用戶體驗(yàn)
聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)