【问题标题】:Determining if input data is "balanced"确定输入数据是否“平衡”
【发布时间】:2021-05-20 22:57:50
【问题描述】:

我一直在创建一个程序来检查输入文件(使用文件重定向传入)是否具有所有匹配的括号、方括号和/或大括号。 (例如:[][]{}() 是“平衡的”,而 [[}] 是“不平衡的”)。

#include <iostream>
#include <vector>
#include <stack>

using namespace std;



int main() {
    
    stack<char> paren;
    string contents;
    
    while(cin >> contents) {
        for(auto &i : contents) {
            if(contents[i] == '(' || contents[i] == '{' || contents[i] == '[') {
                paren.push(contents[i]);
            }
            if(contents[i] == ')' || contents[i] == '}' || contents[i] == ']') {
                if(paren.top() == '(' || paren.top() == '{' || paren.top() == '[') {
                    paren.pop();
                }
            }
        }
        
    }
    
    if(paren.empty() == true) {
        cout << "Balanced" << endl;
    }
    else {
        cout << "Not Balanced" << endl;
    }
    
    return 0;
}

我遇到了两个需要帮助的问题:

(1) 当我在字符串上使用 [] 运算符来定位每个单独的字符以进行比较时,终端(我使用 Mac 作为参考)告诉我隐式转换更改。是否有某种类型的转换或其他方式来索引字符串,以便不会出现此错误?或者如果我将数据作为字符读入,我的代码会起作用吗?

(2) 我的程序的逻辑只适用于部分测试用例。我的算法中缺少什么以使其适用于所有类型的输入?

谢谢!!!!!!

【问题讨论】:

  • for(auto &amp;i : contents) -- 问问自己:i 是什么类型的变量?它是一个索引,即012等?在该循环中打印出i 的值,这将为您提供有关问题的提示。
  • 有时auto 是魔鬼。
  • [(]) 平衡吗?
  • }{ 平衡吗?这会影响@PaulSanders 的回答。
  • 我不知道它是否平衡,但 }{ 看起来确实像 Pink Floyd 专辑封面。

标签: c++ macos terminal file-io


【解决方案1】:

(1) 这里的问题是常规for 循环和增强for 循环之间的混淆。当你写for(auto &amp;i : contents)时,访问数据的正确方法就是if(i == '(' ||... 将if(contents[i] == '(' || 写入if(contents[i] == '(' || 尝试将i 声明为char&amp;(从std::string 中的value_type 成员推断)到int 以满足std::string 上的operator[](int)

(2) 将文件重定向到stdin 不会导致std::cin 进入错误状态,直到文件完成读取。

【讨论】:

    【解决方案2】:

    您实际上并不需要堆栈 - 您只需跟踪您在处理输入字符串时看到的开括号和右括号的数量。

    因此,假设必须区分不同类型的括号,您可以执行以下操作(我还修复了您的范围 for 循环):

    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string contents;
        
        while (std::cin >> contents)
        {
            int paren_count = 0, brace_count = 0, bracket_count = 0;
    
            for (auto c : contents)
            {
                if (c == '(')
                    ++paren_count;
                if (c == '{')
                    ++brace_count;
                if (c == '[')
                    ++bracket_count;
    
                if (c == ')')
                    --paren_count;
                if (c == '}')
                    --brace_count;
                if (c == ']')
                    --bracket_count;
            }
    
            if (paren_count || brace_count || bracket_count)
                std::cout << "Not Balanced\n";
            else        
                std::cout << "Balanced\n";
        }
    }
    

    示例输入:()
    输出:Balanced

    【讨论】:

    • 哦,我明白了。这更有意义,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2020-12-31
    • 1970-01-01
    相关资源
    最近更新 更多