以上代码运行时间过长,请修改
时间: 2024-02-21 10:57:07 浏览: 62
以下是修改后的代码:
```cpp
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int operastack(char c)
{
stack<char> s;
int count = 0;
while (c)
{
if (c == '@')
break;
else if (c == '(')
s.push(c);
else if (c == ')')
{
if (!s.empty())
{
s.pop();
count++;
}
else
{
return -1; // 返回错误标志,表示括号不匹配
}
}
}
if (s.empty())
{
return count; // 返回括号匹配的数量
}
else
return -1; // 返回错误标志,表示括号不匹配
}
int main()
{
ios::sync_with_stdio(false); // 关闭输入输出同步,加速cin、cout的速度
cin.tie(nullptr); // 解除cin和cout之间的绑定,加速cin、cout的速度
string s;
getline(cin, s); // 读入整行
int n = s.size();
int res = 0;
int left = 0;
for (int i = 0; i < n; i++)
{
if (s[i] == '(')
left++; // 统计左括号数量
else if (s[i] == ')')
{
if (left > 0)
{
left--; // 匹配一个左括号
res += operastack(s[i]); // 统计匹配的括号数量
}
}
}
if (left > 0)
cout << "no" << endl; // 左括号多余
else
cout << res << endl; // 输出匹配的括号数量
return 0;
}
```
主要修改如下:
1.使用 `getline` 函数读入整行字符串,避免使用 `cin` 函数造成的输入输出同步问题,加速输入速度。
2.使用一个变量 `left` 统计未匹配的左括号数量。遍历整个字符串,遇到左括号则增加 `left`,遇到右括号则判断 `left` 是否大于 0,如果大于 0 则匹配一个左括号,同时调用 `operastack` 函数统计匹配的括号数量。
3.在 `main` 函数中根据 `operastack` 函数的返回值和未匹配的左括号数量输出结果。如果左括号数量大于 0,则说明左括号多余,输出 "no";否则输出匹配的括号数量。
阅读全文