資料結構實踐——括號的匹配(棧)
阿新 • • 發佈:2019-01-10
【專案 - 括號的匹配】
假設表示式中允許三種括號:圓括號、方括號和大括號。編寫一個演算法,判斷表示式中的各種左括號是否與右括號匹配。
例如,輸入2+(3+4)*2+{[3]}-8,輸出匹配正確;輸入2+(3+4*[2)+{[3]}-8,輸出匹配錯誤。
提示:
(1)遇到左括號入棧,遇到右括號後,出棧一個符號,看是否配對。若配對,繼續,直到讀完所有的符號,棧也正好為空。若在中間出現一個不配對的,或者____,則可以得出不配對的結論。
(2)也可以設計一個返回值為布林型的函式,引數為要配對的表示式,為一個字串。
[參考解答] (兩種解法均有Bug,請看2樓評論)
解法1:標頭檔案sqstack.h請見[ 順序棧演算法庫],使用鏈棧也可以。
#include <stdio.h>
#include "sqstack.h"
int main()
{
char c;
char st[50];
int d=1, i;
SqStack *s;
InitStack(s);
printf("請輸入表示式:");
scanf("%s", st);
for(i=0; st[i]!='\0'&&d; i++)
{
switch(st[i])
{
case'(':
case '[':
case'{':
Push(s, st[i]);
break;
case')':
Pop(s, c);
if(c!='(') d=0;
break;
case']':
Pop(s, c);
if(c!='[') d=0;
break;
case'}':
Pop(s,c);
if(c!='{' ) d=0;
break;
}
}
if(StackEmpty(s)&&d==1)
printf("配對正確!!\n");
else
printf("配對錯誤!!\n");
return 0;
}
解法2:寫成專門的函式
#include <stdio.h>
#include "sqstack.h"
bool isMatch(char *st)
{
int d=1, i;
char c;
SqStack *s;
InitStack(s);
for(i=0; st[i]!='\0'&&d; i++)
{
switch(st[i])
{
case'(':
case'[':
case'{':
Push(s, st[i]);
break;
case')':
Pop(s, c);
if(c!='(') d=0;
break;
case']':
Pop(s, c);
if(c!='[') d=0;
break;
case'}':
Pop(s,c);
if(c!='{') d=0;
break;
}
}
if(StackEmpty(s)&&d==1)
return true;
else
return false;
}
int main()
{
char st[50];
printf("請輸入表示式:");
scanf("%s", st);
if(isMatch(st))
printf("配對正確!!\n");
else
printf("配對錯誤!!\n");
return 0;
}