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

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

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

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);
 }
    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/xiaofei__/article/details/51106700
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞