酷代码 AI
菜单

#include <iostream> #include <stack> #include <string> using namespace std; // 判断字符串是否为合法括号序列 bool isValid(const string& s) { stack<char> st; for (char c : s) { //遍历字符串s中每个字符赋值给c if (c == '(' || c == '[' || c == '{') { st.push(c); //放到栈中 ,位于栈底 } else { if (st.empty()) return false; //空 char top = st.top(); //查询栈顶 st.pop();

这段代码整体逻辑正确,不过存在一些潜在的小问题,以下是详细分析与相应的修正建议: 1. 缺少输入验证 在 `main` 函数里,代码直接假定输入的 `T` 是一个有效的正整数,并且后续输入的字符串仅包含括号字符。要是输入不符合要求,程序也许会出现未定义行为。 2. 异常输入处理 当输入的字符串包含除括号之外的字符时,程序不会进行特别处理,可能会产生不符合预期的结果。 修正后的代码 ```cpp #include <iostream> #include <stack> #include <string> using namespace std; // 判断字符串是否为合法括号序列 bool isValid(const string& s) { stack<char> st; for (char c : s) { // 只处理括号字符,忽略其他字符 if (c == '(' || c == '[' || c == '{') { st.push(c); } else if (c == ')' || c == ']' || c == '}') { if (st.empty()) return false; char top = st.top(); st.pop(); if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) { return false; } } } return st.empty(); } int main() { int T; // 验证输入的 T 是否为有效的正整数 while (!(cin >> T) || T <= 0) { cout << "输入的测试用例数量必须是正整数,请重新输入: "; cin.clear(); cin.ignore(10000, '\n'); } for (int i = 0; i < T; ++i) { string s; cin >> s; if (isValid(s)) { cout << "YES" << endl; } else { cout << "NO" << endl; } } return 0; } ``` 代码解释 1. `isValid` 函数: - 仅处理括号字符,忽略其他字符。 - 若遇到左括号,将其压入栈中。 - 若遇到右括号,检查栈是否为空,若为空则返回 `false`;若栈不为空,弹出栈顶元素并检查是否匹配,若不匹配则返回 `false`。 - 遍历结束后,若栈为空则返回 `true`,否则返回 `false`。 2. `main` 函数: - 验证输入的 `T` 是否为有效的正整数,若不是则提示用户重新输入。 - 循环读取 `T` 个字符串,调用 `isValid` 函数判断是否为合法括号序列,并输出结果。 通过这些修改,程序的健壮性得到了提升,能够处理异常输入。 [2025-12-04 18:51:20 | AI问答 | 685点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多