算法——括号匹配问题(堆栈应用)

来源:互联网 发布:win10电脑mac地址修改 编辑:程序博客网 时间:2024/04/30 22:48

【例】假设有一个算术表达式包含圆括号、方括号和花括号,编写一个函数,用来判别表达式中的括号是否正确匹配,并设计一个测试主函数。

【分析】括号匹配共有一下四种情况:
①左、右括号匹配不正确;
②右括号多于左括号;
③左括号多余右括号;
④左右括号匹配正确。
另外,还应该想到,“何时进栈”,“何时出栈”,“何时取栈顶元素”,“何时栈空”

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 100typedef 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); }
0 0
原创粉丝点击