栈的应用——括号匹配(C++实现)

栈的应用——括号匹配(C++实现)

实现代码

/*
author : eclipse
email  : [email protected]
time   : Sun Apr 12 16:33:43 2020
*/

#include<bits/stdc++.h>
using namespace std;

bool match(string str) {
    stack<char> s;
    for (int i = 0; i < str.length(); i++) {
        if (str[i] == '(' || str[i] == '[') {
            s.push(str[i]);
        } else if (str[i] == ')') {
            if(!s.empty() && s.top() == '(') {
                s.pop();
            }
            else{
                return false;
            }
        } else if (str[i] == ']') {
            if(!s.empty() && s.top() == '[') {
                s.pop();
            }
            else{
                return false;
            }
        }
    }
    return s.empty() ? true : false;
    
}

int main(int argc, char const *argv[])
{
    string str;
    while(cin >> str) {
        printf("%s\n", match(str) ? "YES" : "NO");
    }
    return 0;
}

算法思路

  • 本算法忽略所有的非括号元素,遍历表达式字符串,遇到左括号,则压栈,遇到一个右括号就弹栈,判断弹出的栈顶元素是否能与当前右括号匹配,若能,则继续遍历表达式直到遍历结束,否则,返回错误值,括号匹配不正确。遍历结束后,若栈空,则表达式括号都匹配正确输出NO,否则表达式中的括号不匹配则输出NO。
  • 问题规模n下,本算法时空复杂度均为O(n)。

测试数据

(9+9)+(10+123123)+[(9+0)+(9+89)]+[(9+0)]
(9+9)+(10+123123)+[(9+0)+(9+89)]+[(9+0)]([][][])[[[[[()()]]]]]
(9+9)+(10+123123)+[(9+0)+(9+89)]+[(9+0)]([][][])[[[[[()()]]])]]
(9+9)+(10+123123)+[(9+0)+(9+89)]+[(9+0)]([][][])[[([[[()()]]])]]
  • 注意:输入数据中间不能有空格,否则会导致cin读取字符串时字符串被截断,从而导致意想不到的结果

输出结果

YES
YES
NO
YES

最后

  • 本算法为简单的栈应用
  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
发布了16 篇原创文章 · 获赞 4 · 访问量 325

猜你喜欢

转载自blog.csdn.net/qq_44486439/article/details/105495014
今日推荐