資料結構:用連結串列實現棧的括號匹配
阿新 • • 發佈:2018-12-17
完成以下程式,並在右邊空白處,對錯誤進行修改,並記錄下程式執行結果:
1. 編寫演算法,判斷一表達式中的括號是否配對,包括大、中、小三類括號。
連結串列版本:
#include <cstdio> #include <cmath> #include <cstring> #include <iostream> #include <algorithm> #include <stack> #include <string> using namespace std; /**棧的鏈式儲存**/ typedef struct Data{ char c; }; typedef struct Stack{ Data data; Stack *top; //指向棧頂元素 }; /**初始化空棧**/ void InitStack(Stack *S){ S->top = NULL; } /**判斷是否為空棧**/ int StackEmpty(Stack S){ //為空返回1否則返回0 if(S.top==NULL) return 1; else return 0; } /**返回棧頂元素**/ void GetTop(Stack S,Data *d){ if(StackEmpty(S)==1) printf("It's an empty stack!"); else{ d->c = S.top->data.c; } } /**向棧頂插入新元素 入棧**/ void PushStack(Stack *S,Data d){ Stack* p = (Stack *)malloc(sizeof(Stack)); p->data.c = d.c; p->top = S->top; S->top = p; } /**從棧頂刪除元素 出棧**/ void PopStack(Stack *S,Data *d){ if(StackEmpty(*S)==1){ printf("It's an empty stack!\n"); }else{ Stack *p = S->top; S->top = p->top; d->c = p->data.c; } } /**清空棧**/ void ClearStack(Stack *S){ if(StackEmpty(*S)==1){ printf("It's already an empty stack!\n"); }else{ S->top = NULL; } } /**列印棧內資訊**/ void PrintStack(Stack S){ if(StackEmpty(S)==1){ printf("It's an empty stack!\n"); }else{ printf("name----age\n"); while(S.top!=NULL){ printf("%s\n",S.top->data.c); S.top = S.top->top; } } } /**檢查右括號與棧頂元素是否匹配**/ int Match(Data r,Data s){ //匹配成功返回1 if(r.c==')'&&s.c=='('){ return 1; }else if(r.c=='}'&&s.c=='{'){ return 1; }else if(r.c==']'&&s.c=='['){ return 1; }else{ return 0; } } /**括號匹配**/ int CheckMatch(char *m,Stack *S){ Data r,s; while(*m){ switch (*m){ case '(': case '{': case '[': s.c = *m; //賦值 PushStack(S,s); //進棧 *m++; //向後移動 break; case ')': case '}': case ']': if(StackEmpty(*S)){ //棧空 printf("資料中 %s 沒有匹配!\n",*m); return 0; } GetTop(*S,&s); //獲取棧頂元素 r.c = *m; if(Match(r,s)){ //匹配判斷 PopStack(S,&s); *m++; }else{ printf("資料中 %c 沒有匹配項!\n",*m); return 0; } default: *m++; } } return 1; } int main(){ char d[100]; Stack S; //定義一個S的棧 char *p; //定義一個指標 scanf("%s", d); p = d; //指向表示式 InitStack(&S); //初始換棧 if(CheckMatch(p,&S)) { printf("匹配成功!\n"); } //匹配棧 else printf("匹配不成功!"); return 0; }
C++版本:
#include <cstdio> #include <cmath> #include <cstring> #include <iostream> #include <algorithm> #include <stack> #include <string> using namespace std; typedef long long LL; char a[100]; int n, m; stack <char> s; int main() { scanf("%s", a+1); int len = strlen(a + 1); int flag = 1; int f = 0; cout << "len == " << len << endl; while(len) { len--; // cout << "now == " << a[flag] << endl; if(a[flag] == '{' || a[flag] == '[' || a[flag] == '(') { s.push(a[flag]); flag++; } else if( flag == 1 && (a[flag] == '}' || a[flag] == ']' || a[flag] == ')')) { f = 1; break; } else if((a[flag] == '}' && s.top() == '{') || (a[flag] == ']' && s.top() == '[')|| (a[flag] == ')' && s.top() == '(') ){ s.pop(); flag++; continue; } else{ cout << "a[flag] == " << a[flag] << endl; cout << "s.top == " << s.top() << endl; f = 1; break; } } if(f == 1) cout << "這個括號沒有完全匹配" << endl; else cout << "括號已經完全匹配" << endl; return 0; }