天天看點

括号比對問題 棧c語言流程圖,c++利用順序棧解決括号比對問題

給定一串字元,不超過100個字元,可能包括括号、數字、字母、标點符号、空格,程式設計檢查這一串字元中的( ) ,[ ],{ }是否比對。

輸入格式:

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

輸出格式:

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

輸入樣例1:

sin(10+20)

輸出樣例1:

yes

輸入樣例2:

{[}]

輸出樣例2:

no

分析:

通過詳讀題目以及例題我們可以知道:程式會讀入随機輸入的一串字元串,而當隻有 ‘(‘和‘)‘ 、‘[‘和‘]‘ 、 ‘{‘和‘}‘相比對的時候輸出“yes”,其他情況都會輸出“no”。

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

将所有的左括号(即" ( 、[ 、{ ")存入棧中,遇到右括号(即" )、]、}")時出棧,再判斷兩者是否比對。

代碼:

#include

#include

using namespace std;

//定義棧

#define max_size 200//棧的最大容量

typedef char datatype;

typedef struct{

datatype zhan[max_size];

int top;//棧頂

}stack;

//棧的初始化

void initial(stack &st)

{

st.top = 0;

}

//類型為datatype的x入棧

void push(stack &st, datatype x)

{

//當棧頂和max_size相等時,棧滿

if(st.top == max_size){

// cout<

cout<

exit(0);

}else{

st.zhan[st.top] = x;

st.top++;

}

}

//出棧

char pop(stack &st){

if(st.top == 0){

// cout<

cout<

exit(0);

}else{

st.top--;

return st.zhan[st.top];

}

}

int main(){

stack s;

initial(s);

string str;

getline(cin, str);

char ch[200]={‘\0‘};

strcpy(ch,str.c_str());

//flag标志狀态 1為括号比對,0為不比對

int flag=1;

int i;

for(i=0; ch[i]!=‘\0‘; i++){

//元素若為{,(,[則入棧

if((ch[i] == ‘{‘ )|| (ch[i] ==‘[‘) || (ch[i] ==‘(‘)){

push(s, ch[i]);

}//元素若為},),]則出棧 指派給a

else if((ch[i] == ‘}‘) || (ch[i] ==‘]‘) || (ch[i] ==‘)‘)){

char a;

a = pop(s);

//若a與ch[i]比對,進行下一個字元掃描

if((a == ‘{‘ && ch[i] == ‘}‘) || (a == ‘(‘ && ch[i] == ‘)‘) || (a == ‘[‘ && ch[i] == ‘]‘)){

continue;

}else flag = 0;

}

}

if(s.top != 0){

flag = 0;

}

if(flag == 0){

cout<

}else cout<

return 0;

}

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

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

錯誤代碼如下:

括号比對問題 棧c語言流程圖,c++利用順序棧解決括号比對問題

運作結果如下:

括号比對問題 棧c語言流程圖,c++利用順序棧解決括号比對問題

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

在參考了《資料結構(c語言版)》李雲清等編著的教程後,我發現我犯了一個緻命的低級錯誤:

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

修改代碼如下:

将傳入的參數為 stack st 改為 => 傳入的參數為 stack &st,

當然,将它寫成具有傳回值的函數或者傳入指針也是可行的。

括号比對問題 棧c語言流程圖,c++利用順序棧解決括号比對問題

2.