数据结构--栈的应用2括号匹配

假设表达式中允许出现两种括号:圆括号()和方括号[],其嵌套的顺序随意,即( [ ( ) ( ) ] )或者 [ ( [ ] [ ] ) ]等为正确的表达式,但是 ( [ ( ] ) 或者 [ ( [ ) ] 或者 ( [ ( ] ) )等为错误的表达式。检查括号是否匹配可以采用如下逻辑:

  • 遍历整个表达式
  • 如果是左括号入栈
  • 如果是右括号则从栈中出栈一个括号,如果与右括号匹配则继续往后遍历,如果不匹配则说明是错误的表达式
  • 如果表示遍历完毕,最后栈为空说明表达式正确否则说明表达式错误

核心代码:

int  brackets_match(void)
{
    //从堆上申请一段空间用于存放字符串
    char *str = (char *)malloc(str_size);

    //初始化一个链表栈
    LinkStack s = stack_init();

    printf("plz input A expression : ");
    scanf("%s",str);

    //遍历整个表达式
    int i = 0;
    char f;
    while(str[i]!='\0'){
        //如果左括号直接入栈
        if(str[i]=='('||str[i]=='{'||str[i]=='['){
            Push(&s,str[i]);
            i++;
            continue;
        }
            //如果是右括号,就出站
            switch (str[i]) {
                case ')':
                    pup(&s, &f);
                    if (f == '(') {
                        i++;
                        continue;
                    } else {
                        printf("The parentheses do not match correctly");
                        return FALSE;
                    }
                    break;
                case '}':
                    pup(&s, &f);
                    if (f == '{') {
                        i++;
                        continue;
                    } else {
                        printf("The parentheses do not match correctly");
                        return FALSE;
                    }
                    break;
                case ']':
                    pup(&s, &f);
                    if (f == '[') {
                        i++;
                        continue;
                    } else {
                        printf("The parentheses do not match correctly");
                        return FALSE;
                    }
                    break;
                default:

                    break;
            }

     i++;
    }
    if(s==NULL)
    {
        printf("Parentheses match correctly\r\n");
        return TRUE;
    } else
    {
        printf("The parentheses do not match correctly\r\n");
        return FALSE;
    }

}

结果显示:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题描述:假设表达式允许两种括号圆括号方括号,其嵌套顺序随意,即CC或[([ ] [ ])]等为正确格式,[( ))或((()均为不正确的格式。检验括号是否匹配的方法可用“期待的紧迫程度”这个概念来描述。例如:考虑下列的括号序列:    [ ( [ ] [ ] ) ]    1 2 3 4 5 6 7 8 当计算机接受了第1个括号以后,他期待着与其匹配的第8个括号出现,然而等来的却是第2个括号,此时第1个括号“[”只能暂时靠边,而迫切等待与第2个括号相匹配的 第7个括号“]”的出现,类似的,因只等来了第3个括号“[”,此时,其期待的紧迫程度较第2个括号更紧迫,则第2个括号只能靠边,让位于第3个括号,显然第3个括号的期待紧迫程度高于第2个括号,而第2个括号的期待紧迫程度高于第1个括号;在接受了第4个括号之后,第3个括号的期待得到了满足,消解之后,第2个括号的期待匹配就成了最急迫的任务了,…… ,依次类推。可见这个处理过程正好和的特点相吻合。 要求:设置一个,每读入一个括号,若是左括号,则作为一个新的更急迫的期待压入,若是右括号,则或者是和当前顶的括号相匹配,或者是不合法的情况,输出“此串括号匹配不合法”。在初始和结束时,应该是空的。 测试数据:输入 #([ ]())#,结果“匹配”  输入 #[( )]#,结果“此串括号匹配不合法”  #为起始和结束标志。
好的,以下是使用 C++ 实现检验表达式括号是否匹配的代码: ```c++ #include <iostream> #include <stack> #include <string> using namespace std; bool is_matching(char opening, char closing) { return (opening == '(' && closing == ')') || (opening == '[' && closing == ']'); } bool is_balanced(string expression) { stack<char> s; for(char& c : expression) { if(c == '(' || c == '[') { s.push(c); } else if(c == ')' || c == ']') { if(s.empty() || !is_matching(s.top(), c)) { return false; } s.pop(); } } return s.empty(); } int main() { string expression1 = "([)]"; string expression2 = "[()]{}{[()()]()}"; if(is_balanced(expression1)) { cout << expression1 << " is balanced." << endl; } else { cout << expression1 << " is not balanced." << endl; } if(is_balanced(expression2)) { cout << expression2 << " is balanced." << endl; } else { cout << expression2 << " is not balanced." << endl; } return 0; } ``` 在这个实现,我们定义了两个函数。`is_matching` 函数用于判断两个括号是否匹配,`is_balanced` 函数用于检查表达式的所有括号是否匹配。我们使用一个字符来存储开括号,并在遇到闭括号时弹出相应的开括号。如果遇到不匹配的括号或者字符为空而表达式还未结束的情况,就说明表达式括号不匹配。 在 `main` 函数,我们定义了两个表达式,分别检查它们是否匹配。您可以根据需要修改 `expression1` 和 `expression2` 变量来尝试不同的输入值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值