c++代码算术表达式求值。以字符序列的形式从终端输入语法正确的、不含变量的算术表达式。利用教材中表3.1给出的算符优先关系,实现对算术四则混合运算表达式的求值。
时间: 2024-11-21 19:38:06 浏览: 16
《信息学奥赛一本通·编程启蒙 C++版》目录 2023.11.01(H).pdf
5星 · 资源好评率100%
在C++中,计算字符序列形式的算术表达式通常涉及到字符串处理、栈数据结构以及解析算法。这里我们使用递归下降解析法(Recursive Descent Parsing)的一个简化版本来实现。首先,我们需要定义一些基本的数据结构,如`Token`用于表示操作数或运算符,以及`Stack`来保存中间结果。
```cpp
#include <iostream>
#include <stack>
#include <cctype>
enum Token {
NUMBER, PLUS, MINUS, TIMES, DIVIDE, EOF
};
struct Tokenizer {
std::string input;
int index;
Token next() {
if (index >= input.length()) return EOF;
char ch = input[index];
if (isdigit(ch)) return NUMBER;
else if (ch == '+' || ch == '-') return static_cast<Token>(ch);
else if (ch == '*' || ch == '/') return static_cast<Token>(ch);
++index; // 如果不是有效字符,直接跳过
return NUMBER; // 默认认为数字作为下一个token
}
bool eos() { return index >= input.length(); }
};
int evaluate(const std::string& expression) {
Tokenizer tokenizer(expression);
Stack<int> numbers;
while (!tokenizer.eos()) {
Token token = tokenizer.next();
switch (token) {
case NUMBER:
numbers.push(std::stoi(tokenizer.input.substr(tokenizer.index, std::string::npos)));
tokenizer.index++;
break;
case PLUS:
int b = numbers.top(); numbers.pop();
int a = numbers.top(); numbers.pop();
numbers.push(a + b);
break;
case MINUS:
b = numbers.top(); numbers.pop();
a = numbers.top(); numbers.pop();
numbers.push(a - b);
break;
case TIMES:
b = numbers.top(); numbers.pop();
a = numbers.top(); numbers.pop();
numbers.push(a * b);
break;
case DIVIDE:
b = numbers.top(); numbers.pop();
a = numbers.top(); numbers.pop();
if (b != 0)
numbers.push(a / b);
else
throw "Error: Division by zero";
break;
}
}
return numbers.top();
}
int main() {
std::string expression;
std::cout << "Enter an arithmetic expression without variables: ";
getline(std::cin, expression);
try {
int result = evaluate(expression);
std::cout << "Result: " << result << std::endl;
} catch (const char* msg) {
std::cerr << msg << std::endl;
}
return 0;
}
```
这个程序会提示用户输入一个算术表达式,然后尝试解析并计算其值。注意,这个简单的示例仅处理了加减乘除运算,没有包含括号处理,对于更复杂的表达式,你需要考虑使用递归语法分析或者引入优先级队列等高级数据结构。
阅读全文