用栈实现计算器 c语言
时间: 2024-06-22 20:02:17 浏览: 109
在C语言中,使用栈(Stack)实现计算器的主要目的是演示递归调用和表达式求值的基本算法,特别是后缀表达式(也称为逆波兰表示法,RPN)。这种方法不需要复杂的符号表或优先级规则,非常适合教学和理解递归。
以下是一个简单的栈实现后缀表达式计算器的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义数据结构
typedef struct {
double num;
} Number;
typedef struct {
char operator;
Number left, right;
} Expression;
// 函数声明
void push(Number stack[], int &top);
double pop(Number stack[], int &top);
char pop_operator(Number stack[], int &top);
// 后缀表达式处理函数
double evaluate_postfix(char* exp);
int main() {
char expression[100];
printf("Enter an expression in postfix notation: ");
fgets(expression, sizeof(expression), stdin);
expression[strcspn(expression, "\n")] = '\0'; // 去除末尾的换行符
double result = evaluate_postfix(expression);
printf("Result: %.2lf\n", result);
return 0;
}
// 栈操作
void push(Number stack[], int &top) {
Number n = {atof(stack[top].num)};
top++;
stack[top] = n;
}
double pop(Number stack[], int &top) {
top--;
return stack[top].num;
}
char pop_operator(Number stack[], int &top) {
top--;
return stack[top].operator;
}
// 表达式求值
double evaluate_postfix(char* exp) {
int top = 0;
Number stack[100]; // 栈大小可调整
stack = {'0'}; // 初始化栈顶为0
for (int i = 0; exp[i] != '\0'; i++) {
if (isdigit(exp[i])) {
push(stack, top); // 如果是数字,压入栈
} else {
double right = pop(stack, top);
double left = pop(stack, top);
switch (exp[i]) {
case '+':
stack[top++] = {left + right};
break;
case '- right};
break;
case '*':
stack[top++] = {left * right};
break;
case '/':
stack[top++] = {left / right};
break;
// 添加其他运算符处理
}
}
}
return pop(stack, top); // 返回结果
}
```
阅读全文