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

假设一个算术表达式中可以包含三种括号:圆括号"(" 和")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。
顺序表类型定义如下:
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
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法描述: 1. 初始化一个栈S。 2. 从左到右扫描表达式的每一个字符。 3. 如果当前字符是左括号(即'('、'{'或'['),则将其压入栈S。 4. 如果当前字符是右括号(即')'、'}'或']'),则取出栈顶元素,如果栈顶元素与当前字符匹配,则继续扫描下一个字符;否则,表达式括号配对算法结束。 5. 如果扫描完表达式后,栈S为空,则表达式括号完全配对;否则,表达式括号配对算法结束。 算法实现: ```c++ #include <iostream> #include <stack> #include <string> using namespace std; bool isMatched(const string& expr) { stack<char> s; for (char c : expr) { if (c == '(' || c == '{' || c == '[') { s.push(c); } else if (c == ')' || c == '}' || c == ']') { if (s.empty()) { return false; } char top = s.top(); s.pop(); if ((c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[')) { return false; } } } return s.empty(); } int main() { string expr = "((a+b)*c)-(d/e)"; if (isMatched(expr)) { cout << "括号配对正确" << endl; } else { cout << "括号配对正确" << endl; } return ; } ``` 算法分析: 该算法的时间复杂度为O(n),其n为表达式字符的个数。算法使用了一个栈来存储左括号,当遇到右括号时,取出栈顶元素进行匹配。如果表达式括号完全配对,则最终栈为空;否则,栈还有元素,表明表达式括号配对

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值