判别给定表达式中所含括号是否正确配对出现的算法

假设一个算术表达式中可以包含三种括号:圆括号"(" 和")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。
顺序表类型定义如下:
typedef struct {
    ElemType *elem;
    int       length;
    int       listsize;
} SqList;  // 顺序表
Stack是一个已实现的栈。
可使用的相关类型和函数:
typedef char SElemType; // 栈Stack的元素类型
Status InitStack(Stack &s);
Status Push(Stack &s, SElemType e);
Status Pop(Stack &s, SElemType &e);
Status StackEmpty(Stack s);
Status GetTop(Stack s, SElemType &e);

实现函数如下:

Status MatchCheck(SqList exp)
/* 顺序表exp表示表达式;                        */
/* 若exp中的括号配对,则返回TRUE,否则返回FALSE */
{
    Stack s;
    SElemType c;
    ElemType *p = exp.elem;
    int state = 0;
    InitStack(s);
    while(p < exp.elem + exp.length){
        if(*p == '{' || *p == '[' || *p == '('){
            Push(s,*p);//遇到"("或者"["或者"{"将其压入栈
        }
        else if(*p == '}' || *p == ']' || *p == ')'){
                if(StackEmpty(s))return FALSE;//此时栈为空,即前面不再有"("或者"["或者"{",后面继续出现")"或者"]"或者"}",则返回FALSE
                GetTop(s,c);
                switch(c){ //匹配栈顶元素
                    case '(' : {
                                if(*p == ')'){
                                        Pop(s,c);
                                        state = 1;
                                        break;
                                    }                                                                       
                                 else return FALSE;
                                }
                    case '[' : {
                                if(*p == ']'){
                                        Pop(s,c);
                                        state = 1; 
                                        break;
                                    }                                    
                                  else return FALSE;
                                }
                    case '{' : {
                                if(*p == '}'){
                                        Pop(s,c);
                                        state = 1; 
                                        break;
                                    }
                                   else return FALSE;
                                }
                }            
        } 
        p++;
    }
    if(StackEmpty(s))state = 1;//栈内元素完全被匹配完
    else state = 0;
    if(state == 1)return TRUE;
    else return FALSE;
}


  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值