利用栈写计算器c语言
时间: 2024-09-07 19:05:32 浏览: 40
利用栈(Stack)实现一个简单的计算器功能,可以采用递归下降解析法(Recursive Descent Parsing)的思想。在C语言中,我们可以创建一个栈来存储操作数和运算符,然后遍历用户输入的表达式字符,处理相应的计算逻辑。
以下是一个简化的示例,这个例子只支持加减操作:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char op; // 运算符
int num; // 操作数
} Token;
// 栈结构体和相关的操作
struct Stack {
Token *tokens;
size_t top;
};
void push(Stack *s, Token t) {
s->tokens = realloc(s->tokens, (s->top + 1) * sizeof(Token));
s->tokens[s->top] = t;
s->top++;
}
Token pop(Stack *s) {
if (s->top == 0)
return (Token){0, 0};
else {
Token ret = s->tokens[s->top - 1];
s->tokens = realloc(s->tokens, s->top * sizeof(Token));
s->top--;
return ret;
}
}
int calculate(Stack *s) {
while (s->top >= 2) { // 只有当栈中至少有两个元素时才进行运算
Token op1 = pop(s);
Token op2 = pop(s);
switch (op1.op) {
case '+':
op2.num += op1.num;
break;
case '-':
op2.num -= op1.num;
break;
default:
printf("Invalid operator\n");
return 0;
}
push(s, op2); // 结果入栈,继续处理下一个运算
}
// 如果只剩下一个元素,它就是最终结果
return s->top > 0 ? s->tokens[0].num : 0;
}
int main() {
Stack s = {NULL, 0};
char input[100];
scanf("%s", input);
for (size_t i = 0; i < strlen(input); ++i) {
if (input[i] == ' ')
continue; // 忽略空格
if (isdigit(input[i])) {
char num[5];
num[4] = '\0';
strncpy(num, &input[i], 4); // 将数字字符串放入临时数组
int value = atoi(num);
push(&s, (Token){'n', value});
} else if (input[i] == '+' || input[i] == '-') {
push(&s, (Token){{input[i]}, 0}); // 入栈运算符但暂时不清除前一个操作数
}
}
// 最后处理最后一个运算符
calculate(&s);
if (s.top > 0)
printf("Result: %d\n", s.tokens[0].num);
else
printf("Empty expression.\n");
return 0;
}
```
注意:这个示例仅适用于基本的加减操作,如果需要更复杂的表达式如乘除、括号等,需要进一步完善处理逻辑,并考虑优先级和括号的影响。同时,这里没有错误检查,实际应用中应该添加适当的边界条件和错误处理。
阅读全文