Codeup[100000605]Problem E-C++版本

本文介绍如何利用C++标准库中的stack解决括号匹配问题。通过压栈与出栈操作,判断输入字符串中的括号是否正确配对。

在之前我们介绍了如何使用C语言解决括号配对的问题,详情可以参考Codeup[100000605]Problem E-C版
下面我们来看下如何使用C++标准库中的stack来解决相同的问题。
在stack头文件中提供了以下几个函数:

  • empty,判断栈是否为空,栈为空时返回真
  • top,获取栈顶元素
  • pop,将栈顶弹出

下面是对应实现的代码:

#include <cstdio>
#include <cstring>
#include <stack>

using namespace std;

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        char line[3000] = {0};
        for (int i = 0; i < n; ++i) {
            scanf("%s", line);
            stack<char> Stack;
            int length = strlen(line);
            int need_continue = 1;
            for (int j = 0; j < length; ++j) {
                char s = line[j];
                //入栈
                if (s == '(' || s == '[' || s == '{') {
                    Stack.push(s);
                } else if (s == ')' || s == ']' || s == '}') {
                    // 栈不为空则进行出栈并弹出
                    if (!Stack.empty()) {
                        char c = Stack.top();
                        Stack.pop();
                        if ((s-c)>2||(s-c)<1) {
                            need_continue = 0;
                            break;
                        }
                    } else {
                        //栈为空直接跳出
                        need_continue = 0;
                        break;
                    }
                }
            }
            if (need_continue == 1 && Stack.empty()) {
                printf("yes\n");
            } else {
                printf("no\n");
            }
        }
    }
    return 0;
}

我们在stack中储存的是char类型的数据,当读取到的元素为{,([时进行压栈操作。而当读取到},),]时进行出栈操作。在出栈之前,需要查看当前栈是否为空,如果为空是不允许出栈的,因为此时栈中根本就没有元素。
如果栈不为空则弹出栈顶元素,查看2个元素大小的差值是否小于2,因为{}的值相差为2,而()之间相差1,其他情况说明括号明显不匹配。
由于括号是匹配的,如果发现此时栈为空的,说明之前根本没有压入相应的括号,此时就可以直接跳出了,后续读取操作不再进行。
最后是通过后的结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值