【数据结构】算法题-括号匹配(栈)(C++)

括号匹配

题目

在编程当中我们只会用到三种括号:圆括号(),方括号[]和花括号{},编译器在编译的时候会检查括号是否正确匹配。例如{[()]}、{()[]{}}都是合法的匹配。但是([)]则是不合法的匹配。请编写一个程序来判断输入的括号序列是否合法。
输入
测试数据由多组,每组数据有一行,为( ) [ ] { }组成的序列,长度不超过1000
输出
对于每组数据输出一行,如果是合法匹配则输出YES,不合法则输出NO,请注意大小写
样例输入
{([()]{})}
样例输出
YES

思路小导

本题也是解法众多,但是万变不离其中,无论如何我们要用到的都是栈的相关知识,在你不懂如何使用栈,修改栈中元素时,不管C语言还是C++都可以直接使用数组在作为基底,对出栈和进栈等等操作(push(),pop(),empty()…)分别写一个函数,在主函数中调用使用即可,此处我们直接使用栈来实现,来复习练习栈的使用。

代码流程

#include
#include

using namespace std;

bool ok(string &s) {//写一个判断括号匹配合法的函数
    stack S;//定义字符栈
    for (auto c:s) {//auto循环方便遍历
        if (c == '(' || c == '[' || c == '{')S.push(c);//如果是左括号就进栈
        if (c == ')') {//如果是右括号
            if (S.empty() || S.top() != '(')return false;//先过滤掉栈为空和栈顶不为相应左括号的情况
            S.pop();//再移出栈
        }
        if (c == ']') {
            if (S.empty() || S.top() != '[')return false;
            S.pop();
        }
        if (c == '}') {
            if (S.empty() || S.top() != '{')return false;
            S.pop();
        }
    }
    return S.empty();//返回栈为空
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
   for(string s;cin>>s;){//循环输入字符串,题目要求多组输入,若给出固定组数,再循环前定义输入即可
        if (ok(s)) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }
    return 0;
}

小结

1.本题首先要知道哪些条件才可以判断合法的匹配
2.然后理好思绪每一步要实现的内容
3.正确使用栈
4.操作过程中倘若有误,一定要多测试,实践出真知,有时可以用cerr代替cout来输出表示测试的数据。

你可能感兴趣的:(算法,数据结构,c++,栈,算法,数据结构,程序设计)