1. 程式人生 > >c++利用順序棧解決括號匹配問題

c++利用順序棧解決括號匹配問題

already 括號匹配問題 是否 data ems else if alt 問題 http


題目:

7-1 括號匹配 (30 分)

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

輸入格式:

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

輸出格式:

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

輸入樣例1:

sin(10+20)

輸出樣例1:

yes

輸入樣例2:

{[}]

輸出樣例2:

no


分析:

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

這時候我們可以采用順序棧的結構來解決這一個問題:
將所有的左括號(即" ( 、[ 、{ ")存入棧中,遇到右括號(即" )、]、}")時出棧,再判斷兩者是否匹配。



代碼:

#include<iostream>
#include<string.h>
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<<"This stack has already full!";
cout<<"no";
exit(0);
}else{
st.zhan[st.top] = x;
st.top++;
}
} //出棧
char pop(stack &st){
if(st.top == 0){
// cout<<"This stack is empty!";
cout<<"no";
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<<"no";
}else cout<<"yes";
return 0;
}
編程過程中遇到的問題: 1. 在對字符串進行入棧操作時s.top(棧頂)的數值不增加,總為1 錯誤代碼如下: 技術分享圖片 運行結果如下: 技術分享圖片 這段代碼對於初學者來說看上去邏輯和操作過程似乎都沒有問題,同時也困擾了我許久, 在參考了《數據結構(c語言版)》李雲清等編著的教程後,我發現我犯了一個致命的低級錯誤: 編程push函數的時候,傳入的參數為 stack st ,是不具有返回的功能,也就意味著在 push 函數中對於 st.top++ 這個操作沒有更改主函數中st.top的數值。 修改代碼如下: 將傳入的參數為 stack st 改為 => 傳入的參數為 stack &st, 當然,將它寫成具有返回值的函數或者傳入指針也是可行的。 技術分享圖片 2.



c++利用順序棧解決括號匹配問題