输入仅一行,给出一个算数表达式。表达式中包含:小括号,加减乘除,指数运算符,负号,整数,空格。其中负号的优先级最高(-),其次是指数运算(^),然后是乘除(*/),最后是加减(+-)。 这里规定除法为整除运算,如 5 / 2 = 2, 8 / -3 = -2 等等,与C++中的整除一致。另外注意指数运算为右结合,即 2^3^2 = 2^9 = 512 而非 2^3^2 = 8^2 = 64 。 输入的字符串长度不超过100。如果输入的表达式出现括号不匹配或者除零错误,输出一行“Error”(不含引号),否则输出运算结果。输入保证不包含任何其它类型的错误。 输入的数,输出的答案,以及中间结果均保证是不超过 long long 范围的整数。在不使用STL容器的前提下C++代码实现
时间: 2024-02-21 08:57:00 浏览: 74
C++实现带括号正整数加减乘除的计算器(代码中提供了测试用例)
5星 · 资源好评率100%
我理解了你的问题,以下是我的回答:
可以使用递归的方法求解表达式的值。从左到右扫描表达式,遇到数字则记录下来,遇到符号则判断其优先级并进行相应的操作。具体实现可以参考下面的代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
long long calc(const char* s, int& cur) {
long long num = 0;
bool neg = false;
while (s[cur] == ' ') {
cur++;
}
if (s[cur] == '-') {
neg = true;
cur++;
}
if (s[cur] == '(') { // 处理括号
cur++;
num = calc(s, cur);
if (s[cur] != ')') {
cout << "Error" << endl;
exit(0);
}
cur++;
} else { // 处理数字
while (isdigit(s[cur])) {
num = num * 10 + s[cur] - '0';
cur++;
}
if (neg) {
num = -num;
}
}
while (s[cur] == ' ') {
cur++;
}
if (s[cur] == '^') { // 处理指数
cur++;
long long exp = calc(s, cur);
if (exp < 0) {
cout << "Error" << endl;
exit(0);
}
num = pow(num, exp);
} else if (s[cur] == '*' || s[cur] == '/') { // 处理乘除
char op = s[cur];
cur++;
long long right = calc(s, cur);
if (right == 0 && op == '/') {
cout << "Error" << endl;
exit(0);
}
if (op == '*') {
num *= right;
} else {
num /= right;
}
} else if (s[cur] == '+' || s[cur] == '-') { // 处理加减
char op = s[cur];
cur++;
long long right = calc(s, cur);
if (op == '+') {
num += right;
} else {
num -= right;
}
}
return num;
}
int main() {
char s[105];
cin.getline(s, 105);
int cur = 0;
cout << calc(s, cur) << endl;
return 0;
}
```
注意,由于 C++ 的 pow 函数返回的是浮点数,需要自己实现一个整数版的 pow 函数。
阅读全文