设计并实现算术表达式计算算法。,利用C语言
时间: 2024-10-09 09:00:58 浏览: 33
算术表达式计算的实现(C语言).pdf
5星 · 资源好评率100%
设计和实现一个简单的算术表达式计算算法,我们可以使用递归解析器,也称为逆波兰表示法(Reverse Polish Notation, RPN)。在C语言中,这通常涉及到三个步骤:输入表达式、转换成RPN栈操作数和计算。
以下是基本的步骤:
1. **符号识别**:
- 分割输入的字符串,区分运算符(+,-,*,/,()等)和数字。
2. **转换到RPN**:
- 将运算符压入栈,当遇到左括号时。
- 当遇到数字时,将其压入栈。
- 遇到右括号时,将栈顶的两个元素弹出进行运算,然后继续处理下一个元素。
3. **计算RPN表达式**:
- 使用循环遍历剩余的栈元素,依次取出两个操作数进行运算,并将结果压回栈。
- 最终栈顶的元素就是表达式的计算结果。
下面是一个简化的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stack>
#include <ctype.h>
typedef struct Node {
char op;
double num;
} Node;
// 函数实现
double eval(char *tokens) {
stack<Node> s;
Node top;
int i = 0;
while (tokens[i] != '\0') {
if (isdigit(tokens[i])) {
// 读取数字
top.num = 0;
while (isdigit(tokens[i])) {
top.num = top.num * 10 + (tokens[i] - '0');
i++;
}
i--;
// 添加数字节点
s.push(top);
} else if (tokens[i] == '+' || tokens[i] == '-' || tokens[i] == '*' || tokens[i] == '/') {
// 读取运算符
top.op = tokens[i];
i++;
// 弹出最近的两个操作数
if (s.empty()) {
printf("Error: missing operand\n");
return 0;
}
double b = s.top().num;
s.pop();
double a = s.top().num;
s.pop();
switch (top.op) {
case '+':
s.push({'+', a + b});
break;
case '-':
s.push({'-', a - b});
break;
case '*':
s.push({'*', a * b});
break;
case '/':
if (b == 0) {
printf("Error: Division by zero\n");
return 0;
}
s.push({'/', a / b});
break;
}
} else if (tokens[i] == '(') {
s.push({'(', 0});
} else if (tokens[i] == ')') {
while (!s.empty() && s.top().op != '(') {
double b = s.top().num;
s.pop();
double a = s.top().num;
s.pop();
switch (s.top().op) {
case '+':
s.push({'+', a + b});
break;
case '-':
s.push({'-', a - b});
break;
case '*':
s.push({'*', a * b});
break;
case '/':
if (b == 0) {
printf("Error: Division by zero\n");
return 0;
}
s.push({'/', a / b});
break;
}
}
if (!s.empty())
s.pop(); // 移除左括号
}
i++;
}
return s.top().num;
}
int main() {
char expr[] = "3 + 5 * (7 - 4)";
double result = eval(expr);
printf("Result: %.2f\n", result);
return 0;
}
```
阅读全文