C语言利用双栈写一个简单的计算器实现加减乘除
时间: 2024-12-02 19:14:47 浏览: 8
在C语言中,我们可以利用两个栈(一个用于存储操作数,另一个用于存储运算符)来实现一个简单的四则运算计算器,这种设计体现了后进先出(LIFO)的原则,也就是最后入栈的元素最先处理。下面是一个简化的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 100
typedef struct {
int top;
double stack[MAX_STACK_SIZE];
} Stack;
// 创建一个新的栈
Stack* createStack() {
Stack *s = (Stack*)malloc(sizeof(Stack));
s->top = -1;
return s;
}
// 入栈操作
void push(Stack *s, double num) {
if (s->top < MAX_STACK_SIZE - 1)
s->stack[++s->top] = num;
else
printf("Stack overflow.\n");
}
// 出栈操作
double pop(Stack *s) {
if (s->top == -1)
return -1; // 栈空异常
else
return s->stack[s->top--];
}
// 比较操作符优先级并入栈
void processOperator(Stack *ops, char op) {
while (ops->top >= 0 && (op > ops->stack[ops->top] || (op == '*' && ops->stack[ops->top] == '/'))) {
double b = pop(ops);
double a = pop(ops);
double result;
switch (ops->stack[ops->top]) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
if (b != 0)
result = a / b;
else
printf("Division by zero error.\n");
break;
default:
printf("Invalid operator.\n");
return;
}
push(ops, result);
}
push(ops, op);
}
int main() {
Stack *numStack = createStack();
Stack *opStack = createStack();
char input;
while ((input = getchar()) != EOF) {
if (isdigit(input)) { // 如果输入是数字
char num[50];
int i = 0;
while (isdigit(input)) {
num[i++] = input;
input = getchar();
}
num[i] = '\0';
double numValue = atof(num);
push(numStack, numValue);
} else if (input == ' ') continue; // 忽略空格
else if (input == '+' || input == '-' || input == '*' || input == '/') { // 输入运算符
processOperator(opStack, input);
}
}
// 处理剩下的运算符
while (opStack->top != -1) {
double b = pop(numStack);
double a = pop(numStack);
double result;
switch (opStack->stack[opStack->top]) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
if (b != 0)
result = a / b;
else
printf("Division by zero error.\n");
break;
}
printf("%.2lf %c %.2lf = %.2lf\n", a, opStack->stack[opStack->top], b, result);
push(numStack, result); // 结果入栈,准备处理下一个运算符
pop(opStack); // 移除已处理的运算符
}
free(numStack);
free(opStack);
return 0;
}
```
这个程序会读取用户输入的一系列数字、运算符,并通过双栈的方式计算最终结果。注意,这只是一个基础示例,实际应用中需要考虑更完整的错误处理和输入解析。
阅读全文