首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >确定输入数据是否“平衡”

确定输入数据是否“平衡”
EN

Stack Overflow用户
提问于 2021-05-20 22:57:50
回答 2查看 48关注 0票数 0

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

代码语言:javascript
运行
复制
#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)我的程序的逻辑只适用于一些测试用例。对于所有类型的输入,我在算法中遗漏了什么?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-20 23:13:32

您实际上不需要这样的堆栈--您只需跟踪在输入字符串中工作时所看到的打开括号和近括号的数量。

因此,假设必须区分不同类型的括号,您可以这样做(我还修复了ranged for循环):

代码语言:javascript
运行
复制
#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

票数 0
EN

Stack Overflow用户

发布于 2021-05-20 23:15:50

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67628949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档