1. 程式人生 > >資料結構實踐——括號的匹配(棧)

資料結構實踐——括號的匹配(棧)

【專案 - 括號的匹配】
假設表示式中允許三種括號:圓括號、方括號和大括號。編寫一個演算法,判斷表示式中的各種左括號是否與右括號匹配。
例如,輸入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;
}