資料結構 堆疊

2021-09-01 19:11:30 字數 1191 閱讀 2886

對於棧,想必大家都十分熟悉了,也能很快的答出棧是乙個先進後出的佇列。但是在平常程式設計的生活中應用的十分少。在acm中,棧是一種十分重要的資料結構(其他領域也一樣),我們可以用這種資料結構解決一些十分棘手的問題,大大提高了程式的效率。

有這樣一道名為software bugs 的題。題目的意思簡要來說就是去除一篇文章中的所有 」bug」 字段。

有些人可能認為這是一道水題,直接掃瞄文章,將其中的 」bug」 去掉就行。這樣很容易就落進了陷阱。例如對於乙個字串 「 bbubuggg」 直接掃瞄過去得到 「bbuggg」 ,我們發現字串中還有 」bug」(解決了乙個bug,又出現了乙個bug),他們馬上又提出解決方法,我們可以將字串掃瞄兩遍,但是一樣的會有bug出現.......那我們掃瞄到不在出現bug為止,這的確不失為乙個方法,但是經過計算後我們發現這個演算法的時間複雜度是o(n^2)。在數劇比較大的情況下,這是不可能在規定時間裡出結果的!!!

若我們採用堆疊這種資料結構。演算法原理如下:若棧中元素小於兩個或壓入的字元不為』 g』,則將字元壓入棧中,否則判斷棧頂的兩個元素是否為』b』和』u』,若不是則將』g』壓入棧中,否則將棧頂的兩個元素彈出。

這樣似乎沒有什麼區別,讓我們舉個例子看看,對於字串 「bbubugg」,下面模擬棧中的情況。

棧 即將要壓入的元素

bb b

b b u

b b u b

b b u b u

b b u b u g //符合條件,棧頂的兩個元素將被彈出

b b u g //符合條件,棧頂的兩個元素將被彈出

b gb g

所以最後的答案就是bg,不管巢狀多少層,這個資料結構都能以o(n)的時間複雜度計算出答案,下面貼出c++**

#include

#include

using namespace std;

int main()else if(stk[top-1]=='b'&&stk[top]=='u')else

}for(int i=0;i<=top;i++)

cout << stk[i];

cout << endl;

cin >> s;

}return 0;

}

同樣的,我們可以利用這個資料結構做表示式求值,布林表示式求值。poj2106-boolean expressions就是這個型別的題目。

資料結構 堆疊

引入 多項式計算問題 例如 62 3 42 62 6 2 3 33 3 3 0 042 4 2 8 僅計算最近的兩個數 08 0 8 8 結束 需要某種方式 順序儲存,倒序輸出 堆疊 堆疊 具有操作約束性的線性表 入棧void push stack s,elementtype x else 出棧 e...

資料結構 堆疊

可以認為具有一定約束的線性表,其插入和刪除都作用於棧頂 top 的端點位置。且最 棧的資料最先彈出。壓入棧 push 插入資料 彈出棧 pop 取出 刪除 資料 型別名稱 堆疊 stack 資料物件集 乙個有0個或多個元素的有窮線性表 操作集 對於乙個具體的長度為正整數的maxsize的堆疊s st...

資料結構 堆疊

1 stack.h 2 ifndef stack h 3 define stack h45 struct nodestack 6 typedef struct nodestack ptrtonode 7typedef ptrtonode stack 8 typedef char elementtyp...