用c语言编写程序:表达式求值问题,应用“栈”编写一个计算器,要求: a) 支持整数(长整型范围内)四则混合运算; b) 输入应是中缀表达式,对不合法的输入应有提示; c) 能够输出正确计算结果; d) 示例 如 输入 5*(10-3) / 7 ,输出结果 5
时间: 2024-01-22 18:20:02 浏览: 85
表达式求值
以下是用C语言编写的表达式求值计算器:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_EXPR_LEN 100 // 表达式最大长度
#define MAX_STACK_SIZE 20 // 栈最大深度
typedef struct {
int top; // 栈顶指针
char data[MAX_STACK_SIZE]; // 栈数据
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
int isFull(Stack *s) {
return s->top == MAX_STACK_SIZE - 1;
}
int isEmpty(Stack *s) {
return s->top == -1;
}
void push(Stack *s, char ch) {
if (isFull(s)) {
printf("Stack Overflow\n");
exit(1);
}
s->data[++s->top] = ch;
}
char pop(Stack *s) {
if (isEmpty(s)) {
printf("Stack Underflow\n");
exit(1);
}
return s->data[s->top--];
}
char peek(Stack *s) {
if (isEmpty(s)) {
printf("Stack Underflow\n");
exit(1);
}
return s->data[s->top];
}
int precedence(char op) {
switch(op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
case ')':
return 0;
default:
printf("Invalid operator: %c\n", op);
exit(1);
}
}
int isOperator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
long evaluate(char *expr) {
Stack opStack, valStack;
initStack(&opStack);
initStack(&valStack);
char *p = expr;
while (*p != '\0') {
if (isdigit(*p)) {
long num = 0;
while (isdigit(*p)) {
num = num * 10 + (*p - '0');
p++;
}
push(&valStack, (char)num);
} else if (isOperator(*p)) {
while (!isEmpty(&opStack) && precedence(*p) <= precedence(peek(&opStack))) {
char op = pop(&opStack);
long num2 = pop(&valStack);
long num1 = pop(&valStack);
switch(op) {
case '+':
push(&valStack, num1 + num2);
break;
case '-':
push(&valStack, num1 - num2);
break;
case '*':
push(&valStack, num1 * num2);
break;
case '/':
if (num2 == 0) {
printf("Division by zero\n");
exit(1);
}
push(&valStack, num1 / num2);
break;
}
}
push(&opStack, *p);
p++;
} else if (*p == '(') {
push(&opStack, *p);
p++;
} else if (*p == ')') {
while (peek(&opStack) != '(') {
char op = pop(&opStack);
long num2 = pop(&valStack);
long num1 = pop(&valStack);
switch(op) {
case '+':
push(&valStack, num1 + num2);
break;
case '-':
push(&valStack, num1 - num2);
break;
case '*':
push(&valStack, num1 * num2);
break;
case '/':
if (num2 == 0) {
printf("Division by zero\n");
exit(1);
}
push(&valStack, num1 / num2);
break;
}
}
pop(&opStack);
p++;
} else if (*p == ' ' || *p == '\t') {
p++;
} else {
printf("Invalid character: %c\n", *p);
exit(1);
}
}
while (!isEmpty(&opStack)) {
char op = pop(&opStack);
long num2 = pop(&valStack);
long num1 = pop(&valStack);
switch(op) {
case '+':
push(&valStack, num1 + num2);
break;
case '-':
push(&valStack, num1 - num2);
break;
case '*':
push(&valStack, num1 * num2);
break;
case '/':
if (num2 == 0) {
printf("Division by zero\n");
exit(1);
}
push(&valStack, num1 / num2);
break;
}
}
if (isEmpty(&valStack)) {
printf("Invalid expression\n");
exit(1);
}
return (long)pop(&valStack);
}
int main() {
char expr[MAX_EXPR_LEN];
printf("Enter an expression: ");
fgets(expr, MAX_EXPR_LEN, stdin);
long result = evaluate(expr);
printf("Result: %ld\n", result);
return 0;
}
```
该程序使用栈来实现表达式求值,可以支持整数四则混合运算。程序首先读入一个中缀表达式,然后逐个字符进行处理。如果遇到数字,就将它们压入值栈中;如果遇到运算符,则查看运算符栈顶的运算符,如果优先级低于或等于当前运算符,则从值栈中弹出两个数进行计算,并将计算结果压入值栈中;如果遇到左括号,则将它压入运算符栈中;如果遇到右括号,则从运算符栈中弹出运算符,从值栈中弹出两个数进行计算,并将计算结果压入值栈中,直到遇到左括号为止。最后,当运算符栈中还有运算符时,就按照上述方式进行计算,直到运算符栈为空。
注意:该程序只支持整数四则混合运算,不支持浮点数和其他高级运算。如果输入表达式不合法或存在除以0的情况,程序会输出错误提示并退出。
阅读全文