首页 > 解决方案 > 确定输入数据是否“平衡”

问题描述

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

#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) 我的程序的逻辑只适用于部分测试用例。我的算法中缺少什么以使其适用于所有类型的输入?

谢谢!!!!!

标签: c++macosterminalfile-io

解决方案


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

(2) 将文件重定向到在文件读完之前stdin不会导致进入错误状态。std::cin


推荐阅读