淺談數(shù)據(jù)結(jié)構(gòu)中的隊列和棧

隊列與棧的原理及特點(概括屉更,詳解在下面)

棧 Stack

1.先進后出
2.入棧(進棧)push
3.出棧(彈出)pop
4.棧的本質(zhì)是一個特殊的線性數(shù)組(表)晓褪。特殊在只能在表尾進行插入和刪除操作。
5.有順序棧和鏈棧兩種(這里自己去了解一下吧)

隊列 queue

1.先進先出
2.表尾插入,表頭刪除
3.隊列也是一種線性表
4.順序隊列和鏈對芳誓,以循環(huán)順序隊列更加常見

正題前的一個問題(答案在下文)

\color{blue}{C++中的stack是不是一個容器?}

棧的淺談

&emsp啊鸭;棧提供push和pop接口锹淌,所以棧不提供迭代器(iterator),及不能遍歷它赠制。所以STL中棧往往不被歸為容器赂摆,而被歸類為容器適配器container adaapter钟些。
 那就帶來一個問題政恍,STL中棧用什么實現(xiàn)呢? 上圖


可以看到椄莺模可以用數(shù)組或者鏈表來實現(xiàn)迫筑,vector,deque宗弯,list。

用棧實現(xiàn)隊列

push(x)----將一個元素放入隊列的尾部
pop()----- 從隊列首部溢出元素
peek()----- 返回隊列首部的元素
empty() ----- 返回隊列是否為空
注意
&emsp辕棚;在push數(shù)據(jù)的時候,只要數(shù)據(jù)放進輸入棧就好邓厕,但在pop的時候逝嚎,操作就復雜一些,輸出棧如果為空邑狸,就把進棧數(shù)據(jù)全部導入進來(注意是全部導入)懈糯,再從出棧彈出數(shù)據(jù)单雾,如果輸出棧不為空,則直接從出棧彈出數(shù)據(jù)就可以了硅堆。
 如果進棧和出棧都為空的話够掠,說明模擬的隊列為空了。

正題

&emsp疯潭;拿一道題來說吧。匹配括號竖哩,及字符串要有" ( " , " ) " , " [ " , " ] " , " { " , " } " 成對出現(xiàn)脊僚。常見于我們敲代碼括號要匹配。
&emsp辽幌;三種情況:
1.第一種,字符串左方向括號多余不匹配乌企。
2.第二種,括號沒有多余逛犹,但類型不對。
3.第三種舞蔽,字符串右方向括號多余不匹配码撰。

&emsp渗柿;而我們需要的是運用棧的先進后出脖岛,或者叫后進的先出,依次遍歷數(shù)組字符串柴梆,讀到的左括號放進棧中,遇到匹配就出棧绍在,此時就會有三種情況雹有。
1.已經(jīng)遍歷完了字符串臼寄,但是棧不為空,說明有相應(yīng)的左括號沒有右括號來匹配吉拳,所以return false。
2.遍歷字符串匹配的過程中煤惩,發(fā)現(xiàn)棧里沒有要匹配的字符。所以return false盟庞。
3.遍歷字符串匹配的過程中汤善,棧已經(jīng)為空了,沒有匹配的字符了红淡,說明右括號沒有找到對應(yīng)的左括號return false。
當遍歷完在旱,棧時空的,那說明完全匹配驻仅。

bool IsValid(string s)
{
    stack<int> st; 
    for (int i = 0; i < s.size(); i++) 
    {
        if (s[i] == '(') 
            st.push(')');
        else if (s[i] == '{') 
            st.push('}');
        else if (s[i] == '[') 
            st.push(']');
        else if (st.empty() || st.top() != s[i]) 
            return false;
        else 
            st.pop(); // st.top() == s[i]
    }
    return st.empty();
}

*這里其實遞歸就是使用了棧登渣,每一次遞歸調(diào)用都會把函數(shù)的局部變量、參數(shù)值和返回地址等壓入調(diào)用棧中胜茧,然后遞歸返回的時候,從棧頂彈出上一次遞歸的各項參數(shù)呻顽,所以這就是遞歸為什么可以返回上一層位置的原因*
由于參數(shù)多,全局變量等等嬉愧,使用遞歸很容易判斷不充分return的條件喉前,非常容易無限遞歸(或者遞歸層級過深)没酣,造成棧溢出錯誤

文章參考(如有侵權(quán)聯(lián)系刪除):https://mp.weixin.qq.com/s?__biz=MzUxNjY5NTYxNA==&mid=2247484531&idx=1&sn=448cab9a64c6cd00ed55dee847db0c4c&chksm=f9a23722ced5be34488fde245f09dd613d5a45ea9b036615f285b76d4b95b15ff46bb720ad09&scene=178&cur_album_id=1577943906476998657#rd

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末四康,一起剝皮案震驚了整個濱河市狭握,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌论颅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漏设,死亡現(xiàn)場離奇詭異,居然都是意外死亡郑口,警方通過查閱死者的電腦和手機盾鳞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腾仅,“玉大人,你說我怎么就攤上這事鹤耍⊙榇牵” “怎么了稿黄?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵抛猖,是天一觀的道長。 經(jīng)常有香客問我财著,道長撑碴,這世上最難降的妖魔是什么撑教? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任伟姐,我火速辦了婚禮收苏,結(jié)果婚禮上愤兵,老公的妹妹穿的比我還像新娘。我一直安慰自己懦鼠,他們只是感情好,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布肛冶。 她就那樣靜靜地躺著扯键,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荣刑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天延蟹,我揣著相機與錄音叶堆,去河邊找鬼阱飘。 笑死虱颗,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的忘渔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼散址,長吁一口氣:“原來是場噩夢啊……” “哼宣赔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起儒将,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贡翘,沒想到半個月后蹈矮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸣驱,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年北滥,在試婚紗的時候發(fā)現(xiàn)自己被綠了递胧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赡茸。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖占卧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情华蜒,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布贺拣,位于F島的核電站捂蕴,受9級特大地震影響譬涡,放射性物質(zhì)發(fā)生泄漏啥辨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一陨瘩、第九天 我趴在偏房一處隱蔽的房頂上張望级乍。 院中可真熱鬧舌劳,春花似錦玫荣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脸侥。三九已至,卻和暖如春睁枕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背外遇。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诡渴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓妄辩,卻偏偏與公主長得像山上,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子佩憾,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348