考虑符号优先级的简易计算器c语言
时间: 2023-11-23 10:07:56 浏览: 44
以下是一个简单的符号优先级计算器的 C 语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_EXPR_LEN 100 // 最大表达式长度
// 符号栈结构体
struct stack {
int top;
char data[MAX_EXPR_LEN];
};
// 初始化符号栈
void init_stack(struct stack *s) {
s->top = -1;
}
// 判断符号栈是否为空
int is_empty(struct stack *s) {
return s->top == -1;
}
// 判断字符是否为操作符
int is_operator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/');
}
// 判断操作符优先级
int operator_precedence(char op) {
if (op == '*' || op == '/') {
return 2;
} else if (op == '+' || op == '-') {
return 1;
} else {
return 0;
}
}
// 入栈
void push(struct stack *s, char c) {
s->data[++s->top] = c;
}
// 出栈
char pop(struct stack *s) {
return s->data[s->top--];
}
// 获取栈顶元素
char peek(struct stack *s) {
return s->data[s->top];
}
// 计算表达式
int evaluate(char *expr) {
struct stack operator_stack; // 操作符栈
int num_stack[MAX_EXPR_LEN]; // 数字栈
int num_top = -1; // 数字栈顶指针
int i;
init_stack(&operator_stack);
for (i = 0; expr[i] != '\0'; i++) {
if (isdigit(expr[i])) { // 数字
int num = 0;
while (isdigit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
i--;
num_stack[++num_top] = num;
} else if (is_operator(expr[i])) { // 操作符
while (!is_empty(&operator_stack) && operator_precedence(peek(&operator_stack)) >= operator_precedence(expr[i])) {
int num2 = num_stack[num_top--];
int num1 = num_stack[num_top--];
char op = pop(&operator_stack);
int result;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
num_stack[++num_top] = result;
}
push(&operator_stack, expr[i]);
}
}
while (!is_empty(&operator_stack)) { // 处理剩余的操作符
int num2 = num_stack[num_top--];
int num1 = num_stack[num_top--];
char op = pop(&operator_stack);
int result;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
num_stack[++num_top] = result;
}
return num_stack[num_top];
}
int main() {
char expr[MAX_EXPR_LEN];
printf("请输入一个表达式:");
fgets(expr, MAX_EXPR_LEN, stdin);
printf("结果为:%d\n", evaluate(expr));
return 0;
}
```
这个计算器可以处理简单的带符号的数学表达式,包括加、减、乘、除四种运算符。它使用了栈来处理符号优先级,每次扫描到一个操作符时,都将操作符与符号栈顶的操作符进行比较,如果栈顶操作符的优先级不低于当前操作符,则先从数字栈中弹出两个操作数,再从符号栈中弹出一个操作符,进行运算,并将结果压入数字栈中。如果栈顶操作符的优先级低于当前操作符,则直接将当前操作符压入符号栈中。
最后,当表达式扫描完毕后,还需要处理符号栈中剩余的操作符,按照相同的方式进行计算。最终,数字栈中仅剩下一个元素,即为表达式的计算结果。