C语言利用栈的方式实现算术运算的代码
时间: 2024-11-03 19:23:07 浏览: 15
C语言可以使用栈(Stack)来模拟简单的算术表达式求值,例如中缀表达式转后缀表达式(也称为逆波兰表示法),然后通过后缀表达式进行计算。这是一个典型的递归和栈的应用场景。
以下是一个简单的示例,展示了如何将中缀表达式转换为后缀表达式并计算结果:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TOKENS 100
#define TOKEN_PLUS 1
#define TOKEN_MINUS 2
#define TOKEN_MULTIPLY 3
#define TOKEN_DIVIDE 4
#define TOKEN_NUMBER 5
typedef struct {
char operator;
int precedence;
} Token;
Token tokens[MAX_TOKENS];
int top = -1;
// 中缀表达式处理函数
void infixToRPN(char* expression) {
// ... (这里省略了具体的实现细节)
}
// 后缀表达式计算函数
double evalPostfix(char* postfix) {
double stack[MAX_TOKENS] = {0};
int i = 0, j = 0;
while (postfix[i]) {
if (isdigit(postfix[i])) {
// 如果是数字,直接入栈
stack[++j] = atof(&postfix[i]);
i++;
} else {
// 否则是操作符,处理进栈出栈
while (stack[j] != '\0' && precedences[postfix[i]] <= precedences[stack[j]]) {
// 出栈操作数
j--;
printf("%f ", stack[j]);
}
tokens[++top] = (Token){postfix[i], precedences[postfix[i]]}; // 入栈操作符
i++;
}
}
// 处理剩余的栈元素
while (j--) {
printf("%f ", stack[j]);
}
// 对于剩余的操作符,逐个出栈并计算
while (top >= 0) {
printf("%f %c %f\n", stack[top--], tokens[top].operator, stack[top--]);
stack[top++] = performOperation(stack[top], stack[top - 1], tokens[top].operator);
}
return stack[0];
}
// 表达式优先级表
const int precedences[] = {0, 0, 1, 1, 2};
// 实现基本的四则运算
double performOperation(double a, double b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b; // 需要注意除数为零的情况
default:
return 0;
}
}
int main() {
char expression[] = "2 + 3 * 4"; // 示例中缀表达式
char postfix[100];
infixToRPN(expression);
printf("后缀表达式为: ");
for (int i = 0; i <= top; ++i) {
printf("%c ", tokens[i].operator);
}
printf("\n");
double result = evalPostfix(postfix);
printf("计算结果为: %.2lf\n", result);
return 0;
}
```
这个代码首先将中缀表达式转换成后缀表达式,然后按照后缀表达式的规则逐步计算每个操作。注意实际应用中,你需要完整地实现`infixToRPN`函数来完成中缀到后缀的转换,并确保处理好边界条件和错误检查。
阅读全文