資料結構與演算法分析c 棧的應用(2)

2021-08-10 15:14:07 字數 1605 閱讀 4688

檢測括號匹配是比較常見的功能需求,比如編寫**時,往往因為多了乙個括號(當然少了也不行),程式設計工具,例如vs,會提示大批量的錯誤,這時我們往往找到對應缺失的括號新增或去除就可以了。利用棧就可以很高效的實現這一功能。我們僅就圓括號、方括號、花括號的檢測為例進行簡要的闡述。

做乙個空棧。讀入字元知道字串尾部。如果字元是乙個開放字元(「(」、「[」、「」),若棧為空,則報錯,若棧非空,則判斷棧頂的開放字元是否和該封閉字元對應,若對應,則彈出棧頂元素,若不對應,則報錯。字串處理完畢後檢測棧的情況,若非空則報錯。

下面依照演算法原理的闡述,編寫**。

#include 

#include

#include

using

namespace

std;

bool paren(const

string expression)

else

if (expression.at(i) == ')' ||

expression.at(i) == '}' ||

expression.at(i) == ']')

else

else

case

'}':

if (s.top() != '

else

case

']':

if (s.top() != '[')

else

default:

return

false;}}

}}return s.empty();

}

**測試。

int main(int argc, char* argv)

else

system("pause");

return

0;}

關於測試**,字串的讀入有很多方式,

string line;    

cin >> line;

這種方式無法讀入帶空格的字串;

string line; 

getline(cin, line);

這種方式可以讀取一行,以回車符為結束符;

當然還有很多方式,比如讀段落等,有人這樣實現,

string s;  

int n;

cin>>n;

cin.ignore();

for(int i=0;icin,s);

cout

但是需要確定n的大小,固定了行數,這不是我們期望的。

方式有很多,小夥伴可以根據自己需要進行編寫,當然這不屬於本文的討論內容,有興趣的小夥伴可以自己多研究研究。下面看一下結果。

資料結構與演算法分析c 棧的應用(1)

我們知道十進位制數轉換成其他進製數就是不斷地除以該進製數,每次的餘數倒序組合在一起就是轉換後的進製數的值,倒序組合正好利用棧lifo的特性。下面是實現的 比較簡單,不做解釋。include include using namespace std void convert stack s,int64 ...

資料結構與演算法 棧的應用

逆序輸出 輸出的次序和處理次序相反,而且遞迴的深度不容易預知。比如進製轉換,括號匹配 進製轉換 void convert stack char s,int n,int base while n 0 括號匹配 括號匹配 bool paren vector char v elseif s.empty e...

資料結構與演算法 2 棧

2 儲存結構 2.2 鏈式儲存結構 定義 棧是限定僅在表尾進行插入和刪除的線性表。棧是一種線性表。允許插入和刪除的一端稱為棧頂,另一端稱之為棧底。不含任何元素的棧稱之為空棧,並且棧是後進先出。簡稱lifo結構。插入操作稱之為進棧,壓棧,刪除操作稱之為出棧,彈棧。adt 棧 stack data 同線...