利用順序棧解決括號匹配問題(c ) 資料結構

2022-05-18 04:18:27 字數 2629 閱讀 1790

題目:

7-1 括號匹配 (30 分)

給定一串字元,不超過100個字元,可能包括括號、數字、字母、標點符號、空格,程式設計檢查這一串字元中的( ) ,[ ],是否匹配。

輸入在一行中給出一行字串,不超過100個字元,可能包括括號、數字、字母、標點符號、空格。

如果括號配對,輸出yes,否則輸出no。

sin(10+20)
yes
]
no
分析:通過詳讀題目以及例題我們可以知道:程式會讀入隨機輸入的一串字串,而當只有 '('和')' 、'['和']' 、 ''相匹配的時候輸出「yes」,其他情況都會輸出「no」。

這時候我們可以採用順序棧的結構來解決這乙個問題:

將所有的左括號(即" ( 、[ 、")時出棧,再判斷兩者是否匹配。

**:

#include#include

using

namespace

std; //

定義棧

#define max_size 200//

棧的最大容量

typedef

char

datatype;

typedef

struct

stack;

//棧的初始化

void initial(stack &st)

//型別為datatype的x入棧

void push(stack &st, datatype x)

else}

//出棧

char pop(stack &st)

else}

intmain();

strcpy(ch,str.c_str());

//flag標誌狀態 1為括號匹配,0為不匹配

int flag=1;

inti;

for(i=0; ch[i]!='

\0'; i++)

//元素若為},),]則出棧 賦值給a

else

if((ch[i] == '

}') || (ch[i] =='

]') || (ch[i] ==')'

))') || (a == '

(' && ch[i] == '

)') || (a == '

[' && ch[i] == ']'

))else flag = 0

; } }

if(s.top != 0)

if(flag == 0

)else cout<

yes";

return0;

}

程式設計過程中遇到的問題:

1.  在對字串進行入棧操作時s.top(棧頂)的數值不增加,總為1

錯誤**如下:

執行結果如下:

這段**對於初學者來說看上去邏輯和操作過程似乎都沒有問題,同時也困擾了我許久,

程式設計push函式的時候,傳入的引數為 stack st ,是不具有返回的功能,也就意味著在 push 函式中對於 st.top++ 這個操作沒有更改主函式中st.top的數值。

修改**如下:

將傳入的引數為 stack st 改為 => 傳入的引數為 stack &st,

當然,將它寫成具有返回值的函式或者傳入指標也是可行的。

2. 字串入棧時,每個字元都入棧,沒有通過是否為左括號(即" ( 、[ 、 "都是沒有正常顯示出來的,

也就是沒有正常的返回給錯誤**中的 datatype x 。

一開始我以為是在 函式傳入形參的時候,利用引用值返回x 的這種方法並不行,於是我又將它改寫成利用含有返回值函式返回我們需要的 x 這種方法(如上圖錯誤**所示)

但是結果都是一模一樣的,這時候我就揪著這個函式看,很明顯的,既然錯誤不在傳入傳出的引數中那麼只能出現在if 或 else的語句中(顯而易見,是在else中)

bug也很容易看出來了,畢竟也就只有兩句。

修改**如下:

其實改完回來再看的時候也覺得很無語,第乙個入棧的字元(有且只有乙個入棧)是在 st.zhan[ 0 ]  中存放的,

而再錯誤**中我首先pop出來的卻是  st.zhan[ 1 ]  ,並沒有這個字元,程式當然會出錯啦。

總結:在這種呼叫多個函式的這種題目中,debug 可能是最考驗人意志力的一步了

最後再強調一遍: 

基礎真的很重要!!!

&&如有不正確的地方或有值得改進的地方,希望各位大佬指點一下。

:)

括號匹配問題 順序棧

思想 每讀入乙個括號 1 若是左括號,則直接入棧,等待相匹配的同類右括號。2 若是右括號,且與當前棧頂的左括號同型別,則二者匹配,將棧頂的左括號出棧,否則屬於不合法的情況。include include define true 1 define false 0 define stack size 5...

順序棧括號匹配問題

使用順序棧解決括號匹配問題 括號匹配問題 包括三種型別的括號 和其他字元,判斷是否存在對應的左右括號 舉例 s 滿足條件 s 不滿足條件 include using namespace std typedef char elemtype const int maxsize 100 struct sq...

棧解決括號匹配問題

題目 假設乙個表示式中可以包含三種括號 小括號,中括號,大括號,且這三種括號可以任意次序巢狀使用,如 3 5 4 編寫判斷表示式括號是否匹配的程式。表示式為字串。解題思路 解決括號匹配問題我們要考慮的是優先順序,大家學過數學的都知道要想解決這類算式我們要做的就是去括號,去括號不能隨便去,要先去除最後...