栈的应用——括号匹配

描述:

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序任意,即([]())或[([][])]等都为正确的格式,而[(])为不正确的格式。利用栈编程序检验表达式中的括号是否合法。

思路:

1,先实现栈的基本操作:初始化,入栈,出栈等。

2,每读入一个括号,若是右括号,则或者是置于栈顶的左括号得以消解,或者是不合法的情况;若是左括号,则直接入栈。

细节:遇左括号则进栈,遇右括号,出栈与之匹配消解。

#include <stdio.h>
#include <string.h>

#define MaxSize 100
typedef char DataType;

typedef struct{
    DataType data[MaxSize];
    int top;
}Stack;

void InitStack(Stack *S) 
{  
    S->top=-1;
} 
void Push(Stack *S,DataType x)
{
    if(S->top==MaxSize-1)
        printf("\n栈满,无法压栈!\n"); 
    S->top++;
    S->data[S->top]=x; 
}
int EmptyStack(Stack *S)
{ 
    if(S->top== -1)
        return 1;
    else 
        return 0;
}
void Pop(Stack *S,DataType *x)     
{
    if(EmptyStack(S))  
        printf("\n 栈空,无法出栈!"); 
    *x=S->data[S->top];  
    S->top--;
}

void main()
{
    char str[100]="{}[()]";
    int flag=1;
    Stack S;
    DataType e;
    InitStack(&S);
    //scanf("%s",s);
    for(int i=0;i< strlen(str);i++)
    {
        if ( str[i]=='(' || str[i]=='[' || str[i]=='{')
            Push(&S,str[i]);  
        if (str[i]==')' || str[i]==']' || str[i]=='}')
        {    //有一类情况:[[]]]),栈也为空,所以不能直接不空即出栈
            if (EmptyStack(&S))  
            {
                flag=0;
                break;
            }
            else 
            {  
                Pop(&S,&e);    //出栈顶元素,与刚输入的匹配
                if ( str[i]==')' && e!='('  ||  str[i]==']' && e!='['  ||  str[i]=='}' && e!='{' )
                {
                    flag=0;
                    break;
                }
            }
        }
    }
    if (flag==1 && EmptyStack(&S))
        printf("表达式中的括号合法!\n");
    else
        printf("不合法!\n");
}

 结果:

猜你喜欢

转载自www.cnblogs.com/lisen10/p/10835057.html
今日推荐