确定输入数据是否为 "balanced"
Determining if input data is "balanced"
我一直在创建一个程序来检查输入文件(使用文件重定向传入)是否具有所有匹配的圆括号、方括号、and/or 大括号。 (例如:[][]{}() 是“平衡的”,而 [[}] 是“不平衡的”)。
#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
循环):
#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
(1) 这里的问题是混淆了常规 for
循环和增强的 for
循环。当您写 for(auto &i : contents)
时,访问数据的正确方法只是 if(i == '(' ||
...
写入 if(contents[i] == '(' ||
尝试将 i
声明为 char&
(从 std::string
中的 value_type
成员推断)到 int
以满足 operator[](int)
在 std::string
.
(2) 将文件重定向到 stdin
不会导致 std::cin
进入错误状态,直到文件完成读取。
我一直在创建一个程序来检查输入文件(使用文件重定向传入)是否具有所有匹配的圆括号、方括号、and/or 大括号。 (例如:[][]{}() 是“平衡的”,而 [[}] 是“不平衡的”)。
#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
循环):
#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
(1) 这里的问题是混淆了常规 for
循环和增强的 for
循环。当您写 for(auto &i : contents)
时,访问数据的正确方法只是 if(i == '(' ||
...
写入 if(contents[i] == '(' ||
尝试将 i
声明为 char&
(从 std::string
中的 value_type
成员推断)到 int
以满足 operator[](int)
在 std::string
.
(2) 将文件重定向到 stdin
不会导致 std::cin
进入错误状态,直到文件完成读取。