3--4.棧與隊(duì)列

[TOC]

寫在前面

本篇文章整理《數(shù)據(jù)結(jié)構(gòu)(C++語言版)》關(guān)于棧與隊(duì)列這種線性結(jié)構(gòu)知識點(diǎn)。
整個數(shù)據(jù)結(jié)構(gòu)部分章節(jié)列表如下:
1 向量
-- 1.1 遍歷
-- 1.2 唯一化
-- 1.3 查找

2 列表
-- 2.1 列表節(jié)點(diǎn)
---- 2.1.1前插入算法
-- 2.2 列表模板類
---- 2.2.1 列表初始化

3 棧
--3.1 棧應(yīng)用
---- 3.1.1 括號匹配
---- 3.1.2 椃岚混洗甄別
---- 3.1.3 中綴表達(dá)式
4 隊(duì)列

3 棧

后進(jìn)先出(LIFO)是棧這種結(jié)構(gòu)最大的特點(diǎn)禁熏。對棧而言,只有一端的可訪問稱作邑彪,頂端top瞧毙。

棧結(jié)構(gòu)示意及基礎(chǔ)功能

棧也是一種線性結(jié)構(gòu),即滿足邏輯地址連續(xù)锌蓄,故可直接基于向量或列表派生升筏。

//基于vector結(jié)構(gòu)的棧初始化
template<typename T>
class Stack: public Vector<T>{
public:
  void push(T const& e) { insert( size(), e);}  //入棧,等效于作為向量末元素插入
  T pop() { return remove( size() -1); }  //出棧瘸爽,等效于刪除向量末元素
  T& top() { return ( *this ) [ size() - 1 ]; }  //取頂您访,直接返回向量的末元素
};

3.1 棧應(yīng)用

基于棧結(jié)構(gòu)的應(yīng)用剪决,就是要充分利用其后進(jìn)先出LIFO的特性灵汪。

3.1.1 括號匹配

解決問題:判斷一個只含括號的表達(dá)式是否匹配。
算法:從表達(dá)式左側(cè)開始掃描柑潦,當(dāng)掃描到左括號(則壓入棧中享言,若掃描到右括號)則彈出棧頂元素,繼續(xù)掃描下去渗鬼。當(dāng)且僅當(dāng)最后掃描完成時(shí)览露,棧類所有左括號(均已彈出,棧為空棧時(shí)該表達(dá)式括號匹配譬胎。

括號匹配算法示意圖

代碼實(shí)現(xiàn)

bool paren( char exp[], int lo, int hi ) { //exp[lo, hi)
  Stack<char> s;
  for(int i=lo; i < hi; i++){
    if( '(' == exp[i] ) s.push(exp[i]);  //若左括號差牛,入棧
    else if( !s.empty() ) s.pop();  //若右括號命锄,且棧非空,彈出棧頂
      else return false;  //若括號表達(dá)式未掃描結(jié)束偏化,棧已空脐恩,則不匹配
  }
  return s.empty();
}

TIPS:字符串與字符數(shù)組
字符串以空字符\0結(jié)尾,用來標(biāo)記字符串的結(jié)尾侦讨。
char dog[4] = {'a', 'b', 'c', 'd'}; //不是字符串驶冒,是char數(shù)組
char cat[4] = {'a', 'b', 'c', '\0'}; //是字符串,也是char數(shù)組
另一種操作方法是通過雙引號聲明字符串韵卤,若聲明長度比實(shí)際長度長骗污,則空字符將自動補(bǔ)全到實(shí)際長度之后
char bird[5] = "abc"; //實(shí)際為 abc\0\0
char bird[] = "abc"; //編譯器自己判斷字符串長度

3.1.2 椓混洗甄別

解決問題:將棧A中的元素通過棧S轉(zhuǎn)移入棧B中身堡。對元素的移入移出操作只允許以入棧出棧方式。進(jìn)而判斷棧B中元素序列是否是一種椗睦穑混洗贴谎。

棧混洗

算法:不妨設(shè)棧A的元素為升序排列季稳。對棧B中第i個元素擅这,當(dāng)其從棧S彈出前景鼠,S棧頂端以下元素按降序排列溯香。即,若棧S頂元素小于B[i]湿镀,則依次將A中元素入棧树肃;若棧S頂元素等于B[i],則S出棧廓脆,繼續(xù)判斷B[i+1]蚊伞;若棧S頂元素大于B[i],則不是椔尤混洗
該算法的一個典型應(yīng)用場景為火車調(diào)度問題柏靶。
代碼實(shí)現(xiàn)

/*
判斷棧B中序列是否為一種棧混洗
為了簡化問題,棧A、B元素確定,因此可以通過數(shù)組等方式實(shí)現(xiàn)捍靠。
/*
int A = 1;
int B[] = {2, 3, 1, 4, 5};
bool Stackverfi(int A, const int* array_B){
  Stack<int> S;
  for(int i = 0; i < 5; i++){
    while( S.top() < B[i] ){
      S.push(A++);
      std::cout << "push\n";
    }
    if( S.top() == B[i] ){ 
      S.pop();
      std::cout << "pop\n";
    }
    else{
      std::cout << "NO!!!";
      return false;
    }
  }
}

3.1.3 中綴表達(dá)式

算法:對于一個正確的算數(shù)表達(dá)式沐旨,先準(zhǔn)備兩個棧A,B分別用于存儲運(yùn)算符和運(yùn)算數(shù)榨婆。掃描到運(yùn)算數(shù)磁携,則入棧A中;掃描到運(yùn)算符時(shí)良风,與棧B的棧頂運(yùn)算符比較谊迄,若棧頂運(yùn)算符優(yōu)先級較低,則入棧烟央;若棧頂運(yùn)算符優(yōu)先級較高统诺,則彈出棧B頂運(yùn)算符,彈出棧A兩個運(yùn)算數(shù)(若為單元素操作符疑俭,只彈出一個元素)粮呢,將運(yùn)算結(jié)果壓入棧A

采用一個棧結(jié)構(gòu)的算法實(shí)例

4 隊(duì)列

隊(duì)列的特性與棧結(jié)構(gòu)正好相反钞艇,其主要性能是先進(jìn)先出(FIFO)啄寡。具體實(shí)現(xiàn)方式與棧結(jié)構(gòu)類似,這里不過多敘述哩照。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末这难,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子葡秒,更是在濱河造成了極大的恐慌姻乓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眯牧,死亡現(xiàn)場離奇詭異蹋岩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)学少,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門剪个,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人版确,你說我怎么就攤上這事扣囊。” “怎么了绒疗?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵侵歇,是天一觀的道長。 經(jīng)常有香客問我吓蘑,道長惕虑,這世上最難降的妖魔是什么坟冲? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮溃蔫,結(jié)果婚禮上健提,老公的妹妹穿的比我還像新娘。我一直安慰自己伟叛,他們只是感情好得院,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布了罪。 她就那樣靜靜地躺著继控,像睡著了一般主卫。 火紅的嫁衣襯著肌膚如雪瞄沙。 梳的紋絲不亂的頭發(fā)上愧怜,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天初茶,我揣著相機(jī)與錄音壕吹,去河邊找鬼蕊爵。 笑死辉哥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的攒射。 我是一名探鬼主播醋旦,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼会放!你這毒婦竟也來了饲齐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤咧最,失蹤者是張志新(化名)和其女友劉穎捂人,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矢沿,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滥搭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捣鲸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瑟匆。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖栽惶,靈堂內(nèi)的尸體忽然破棺而出愁溜,到底是詐尸還是另有隱情,我是刑警寧澤外厂,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布冕象,位于F島的核電站,受9級特大地震影響汁蝶,放射性物質(zhì)發(fā)生泄漏交惯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望席爽。 院中可真熱鬧意荤,春花似錦、人聲如沸只锻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽齐饮。三九已至捐寥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祖驱,已是汗流浹背握恳。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捺僻,地道東北人乡洼。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像匕坯,于是被迫代替她去往敵國和親束昵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容