C++ 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列
C++ 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列
棧為后進(jìn)先出,隊(duì)列為先進(jìn)先出
用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列。是一個(gè)比較經(jīng)典的問(wèn)題。
看到這個(gè)問(wèn)題,我的第一個(gè)解題思路為:
定義兩個(gè)棧,s1,s2。s1作為入隊(duì)列棧,s2作為出隊(duì)列棧;
入隊(duì)列:每次入隊(duì)列的時(shí)候,將數(shù)值壓入s1棧中;
出隊(duì)列:出隊(duì)列時(shí),將s1中的所有數(shù)據(jù),壓進(jìn)s2棧中,然后刪除s2的棧頂數(shù)據(jù),然后再將s2中的剩余數(shù)據(jù)壓入s1中。
在這其中s1是一個(gè)存儲(chǔ)空間,s2是一個(gè)輔助空間。
進(jìn)一步想一下上述辦法,在出隊(duì)列時(shí),每一次都要將s1倒進(jìn)s2,然后刪除s2棧頂后又將s2的數(shù)據(jù)倒入s1;有另一個(gè)思路可以減少倒的次數(shù);
入隊(duì)列時(shí):將數(shù)據(jù)壓進(jìn)s1;
出隊(duì)列時(shí):判斷如果s2為空,那么將s1中的數(shù)據(jù),壓進(jìn)s2中,然后刪除s2棧頂,如果s2不為空那么再刪除s2的棧頂即可;
并且還可以優(yōu)化,優(yōu)化如下:
出隊(duì)列時(shí),判斷如果s2為空,那么將s1中n-1個(gè)數(shù)據(jù),壓進(jìn)s2中,然后刪除s1中的棧頂,如果s2不為空那么直接刪除s2的棧頂即可;
優(yōu)化版的c++實(shí)現(xiàn)如下:
#include<iostream>
using namespace std;
#include<stack>
//棧 后進(jìn)先出 隊(duì)列 先進(jìn)先出
template<class T>
class Queue
{
public:
/*T Pop_back()
{
if (s2.size() <= 0)
{
while(s1.size() > 0)
{
T& temp = s1.top();
s1.pop();
s2.push(temp);
}
}
if (s2.size() == 0)
throw new exception("queue is empty ");
T tep = s2.top();
s2.pop();
return tep;
}*/
T Pop_back() //比上面少一次出棧
{
if (s2.size() <= 0)
{
while (s1.size() > 1)
{
T& temp = s1.top();
s1.pop();
s2.push(temp);
}
T tep = s1.top();
s1.pop();
return tep;
}
else{
T tep = s2.top();
s2.pop();
return tep;
}
}
void Push_back(const T& value)
{
s1.push(value);
}
bool Empty()
{
return (s1.empty() && s2.empty());
}
protected:
stack<T> s1;
stack<T> s2;
};
void TextQueue()
{
Queue<int> q1;
q1.Push_back(1);
q1.Push_back(2);
q1.Push_back(3);
q1.Push_back(4);
cout << q1.Pop_back() << endl;
cout << q1.Pop_back() << endl;
cout << q1.Pop_back() << endl;
cout << q1.Pop_back() << endl;
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- C++線性表深度解析之動(dòng)態(tài)數(shù)組與單鏈表和棧及隊(duì)列的實(shí)現(xiàn)
- C++?棧和隊(duì)列的實(shí)現(xiàn)超詳細(xì)解析
- C++基礎(chǔ)學(xué)習(xí)之利用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列
- C++用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列(面試官的小結(jié))
- C++利用兩個(gè)棧實(shí)現(xiàn)隊(duì)列的方法
- C++中實(shí)現(xiàn)隊(duì)列類鏈?zhǔn)酱鎯?chǔ)與棧類鏈?zhǔn)酱鎯?chǔ)的代碼示例
- C++數(shù)據(jù)結(jié)構(gòu)深入探究棧與隊(duì)列
相關(guān)文章
C++無(wú)符號(hào)整數(shù)溢出問(wèn)題解析
這篇文章主要介紹了C++無(wú)符號(hào)整數(shù)溢出探究,本文主要探討C/C++中無(wú)符號(hào)整數(shù)超過(guò)范圍后的計(jì)算問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
VC++進(jìn)度條process Bar的用法實(shí)例
這篇文章主要介紹了VC++進(jìn)度條process Bar的用法,是進(jìn)行VC++應(yīng)用程序開(kāi)發(fā)中非常常見(jiàn)的實(shí)用技巧,需要的朋友可以參考下2014-10-10
C++中平衡二叉搜索樹(shù)的模擬實(shí)現(xiàn)
二叉搜索樹(shù)雖可以縮短查找的效率,但如果數(shù)據(jù)有序或接近有序二叉搜索樹(shù)將退化為單支樹(shù),查找元素相當(dāng)于在順序表中搜索元素,效率低下,所以本文給大家介紹了C++平衡二叉的搜索樹(shù)模擬實(shí)現(xiàn)方法,需要的朋友可以參考下2023-09-09
C語(yǔ)言實(shí)現(xiàn)航班訂票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)航班訂票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
C++中數(shù)組作為函數(shù)參數(shù)傳入的幾種方式代碼示例
數(shù)組元素和數(shù)組名都可以作為函數(shù)的參數(shù)以實(shí)現(xiàn)函數(shù)間數(shù)據(jù)的傳遞和共享,下面這篇文章主要給大家介紹了關(guān)于C++中數(shù)組作為函數(shù)參數(shù)傳入的幾種方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
C++實(shí)踐Time類中的運(yùn)算符重載參考方法
今天小編就為大家分享一篇關(guān)于C++實(shí)踐Time類中的運(yùn)算符重載參考方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02

