1. 程式人生 > >演算法——括號匹配問題(堆疊應用)

演算法——括號匹配問題(堆疊應用)

【例】假設有一個算術表示式包含圓括號、方括號和花括號,編寫一個函式,用來判別表示式中的括號是否正確匹配,並設計一個測試主函式。

【分析】括號匹配共有一下四種情況:
①左、右括號匹配不正確;
②右括號多於左括號;
③左括號多餘右括號;
④左右括號匹配正確。
另外,還應該想到,“何時進棧”,“何時出棧”,“何時取棧頂元素”,“何時棧空”

typedef struct
{
    DataType stack[MaxStackSize];
    int top;       //top表示順序堆疊陣列stack的當前棧頂位置
}SeqStack;

void StaticInitiate(*S)
{
    S->top=0
; //初始化棧頂下標值 } int StackNotEmpty(S) //判斷順序堆疊S是否為空,非空返回1,否則返回0 { if(S.top<=0)return 0; else return 1; } int StackPush(SeqStack *S,DataType x)//把資料元素x存入順序堆疊S中,入棧成功返回1,否則返回0 { if(S->top>=MaxStackSize) { printf("堆疊已滿,無法插入!\n") return 0; } else { S->Stack[S->top]=x; S->top++; return
1; } } int StackPop(SeqStack *S,DataType) //取出順序堆疊S的棧頂元素值由引數d帶回,出棧成功則返回1,否則返回0 { if(S->top<=0) { printf("堆疊已空無資料元素出棧!\n"); return 0; } else { S->top--; //得注意top--,--top的差別 *d=S->stack[S->top]; return 1; } } int StackTop(SeqStack S,DataType *d) //取棧頂資料元素值由引數d帶回,成功返回1,不成功返回0
{ if(S.top<=0) { printf("堆疊已空!\n"); return 0; } else { *d=S.stack[S.top-1]; return 1; } }

測試主函式:

#include<string.h>
#include<stdio.h>
#define MaxStackSize 100
typedef char DataType;
#include"SeqStack.h"

 void ExpIsCorrect(char exp[],int n)
 {
     SeqStack myStack;
     int i;
     char c;
     StackInitiate(&myStack);
     for(i=0;i<n;i++)
     {
        if((exp[i]=='(')||(exp[i]=='[']||(exp[i]=='{'))
        {
            StackPush(&myStack,exp[i]);
        }

        else if(exp[i]==')'&&StackNotEmpty(myStack)&&StackTop(myStack,&c=='(')
        {
            StackPop(&myStack,&c);
        }

        else if(exp[i]==')'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c=='(')
        {
            printf("左右括號匹配不正確!\n");
            return 0;
        }
        else if(exp[i]==']'&&StackNotEmpty(myStavk)&&StackTop(myStack,&c)&&c=='[')
        {
            StackPop(&myStack,&c);
        }
        else if(exp[i]==']'&&StackNotEmpty(mySatck)&&StackTop(myStack,c)&&c!='[')
        {
            printf("左右括號匹配次序不正確!\n");
            return;
        }
        else if(exp[i]=='}'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c=='{')
        {
            StackPop(&myStack,&c);
        }
        else if(exp[i]=='}'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c!='{')
        {
            printf("左右括號匹配次序不正確!\n");
            return;
        }
        else if(((exp[i]==')')||(exp[i]==']')||(exp[i]=='}'))&&!=StackNotEmpty(myStack))
        {
            printf("右括號多於左括號!\n");
            return;
        }

     }
     if(StackNotEmpty(myStack))
     {
         printf("左括號多於右括號!\n");
     }
     else
     {
         printf("左右括號匹配正確!\n");
     }
 }

 void main()
 {
     char a[]="(())abc{[]()}";
     char b[]="(()))abc{[]}";
     char c[]="(()()abc{[]}";
     char d[]="(())abc{[]}";
     int n1=strlen(a);
     int n2=strlen(b);
     int n3=strlen(c);
     int n4=strlen(d);
     ExpIsCorrect(a,n1);
     ExpIsCorrect(b,n2);
     ExpIsCorrect(c,n3);
     ExpIsCorrect(d,n4);
 }