当前位置 博文首页 > 可惜浅灰的博客:stack应用:洛谷 P1739 表达式括号匹配

    可惜浅灰的博客:stack应用:洛谷 P1739 表达式括号匹配

    作者:[db:作者] 时间:2021-09-05 19:10

    题目描述:

    ? ??假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。

    ? ? 输入:表达式

    ? ? 输出:”YES" or "NO"

    解题思路:

    ? ? 按字符逐个遍历输入的字符串,不匹配有两种情况:

    1、在遍历中左右括号数量一致时,不能直接出现右括号;

    2、当遍历结束时,不能有没匹配上的左括号。

    定义一个栈,用于存储在遍历中没有匹配上的左括号的个数,有栈中元素类型和值都不重要,遇到左括号使元素入栈;遇到右括号使元素出栈;栈空表示目前的左右括号匹配无误。

    #include <iostream>
    using namespace std;
    #include <stack>
    #include <string>
    
    void solve(const string input)
    {
        stack<int> s;
        for (int i = 0; i < input.length(); i++)
        {
            if (s.empty() && input[i] == ')')
            {
                cout << "NO" << endl;
                break;
            }
            if (input[i] == '(')
            {
                s.push(1);
            }
            else if (input[i] == ')')
            {
                s.pop();
            }
            else if (input[i] == '@')
            {
                break;
            }
            else
            {
                continue;
            }
        }
        if (s.empty())
        {
            cout << "YES" << endl;
        }
        else
        {
            cout << "NO" << endl;
        }
    }
    
    int main()
    {
        string input;
        cin >> input;
        solve(input);
    
        return 0;
    }

    cs
    下一篇:没有了