#include <iostream> #include <stack> using namespace std; int main() { string expression; getline(cin, expression, '@'); // 以@为结尾输入表达式 stack<char> stk; // 建立栈来存储左括号 int cnt = 0; // 记录配对的括号数目 for (char ch : expression) { if (ch == '(') { // 遇到左括号,入栈 stk.push(ch); } else if (ch == ')') { // 遇到右括号,判断是否与栈顶的左括号匹配 if (stk.empty()) { // 如果栈为空,则说明没有左括号和它匹配 cout << "no" << endl; return 0; } stk.pop(); // 栈不为空,则弹出栈顶元素 cnt++; // 记录配对的括号数目加一 } } if (stk.empty()) { // 如果遍历完表达式后栈为空,则说明所有左括号都有与之匹配的右括号 cout << cnt << endl; } else { // 否则还有未匹配的左括号 cout << "no" << endl; } return 0; }优化这个代码
时间: 2024-02-05 07:04:41 浏览: 128
#include_iostream.h_
4星 · 用户满意度95%
以下是对代码的优化建议:
1. 使用快速输入方式
在输入表达式时,可以使用快速输入方式,例如使用scanf来代替cin,这样可以减少输入时间。
2. 使用getline的第三个参数
在使用getline读入字符串时,可以使用第三个参数,指定字符串的结束符,这样可以减少后续的字符串处理,例如可以将表达式中的空格去掉。
3. 减少循环中的判断
在循环中,可以减少判断的次数,例如可以将左括号的判断放到右括号的判断之前。
4. 使用前置++运算符
在记录配对的括号数目时,可以使用前置++运算符,这样可以减少一次赋值操作,提高效率。
5. 将判断条件取反
在判断栈是否为空时,可以将条件取反,这样可以减少一层if判断。
综上所述,可以将代码优化如下:
```
#include <iostream>
#include <stack>
using namespace std;
const int MAXN = 1e6 + 5;
int main() {
char expression[MAXN];
scanf("%[^\n]@", expression); // 使用快速输入方式,并指定结束符为@
stack<char> stk; // 建立栈来存储左括号
int cnt = 0; // 记录配对的括号数目
for (char *p = expression; *p != '@'; p++) { // 将条件判断放在循环中
if (*p == '(') {
stk.push('('); // 左括号入栈
} else if (*p == ')') {
if (stk.empty() || stk.top() != '(') { // 判断栈是否为空,并判断是否匹配
cout << "no" << endl;
return 0;
}
stk.pop(); // 栈不为空,并匹配,则弹出栈顶元素
cnt++; // 记录配对的括号数目加一
}
}
if (stk.empty()) { // 判断栈是否为空
cout << cnt << endl;
} else {
cout << "no" << endl;
}
return 0;
}
```
阅读全文