【用c语言实现用栈完成从键盘输入一个算术表达式,完成表达式求值,表达式中数字可以为一位数,表达式中的符号包括加、减、乘、除、小括号,其中若有括号,则优先计算括号内的式子。
时间: 2024-01-07 17:04:20 浏览: 65
好的,这是一个比较复杂的问题,需要用到栈和逆波兰表达式求值的知识。以下是一个简单的C语言程序,可以实现从键盘输入一个算术表达式,完成表达式求值:
```
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
#define MAX_EXPRESSION_LENGTH 100
typedef enum {
lparen, rparen, plus, minus, times, divide, mod, eos, operand
} precedence;
int isp[] = { 0, 19, 12, 12, 13, 13, 13, 0 };
int icp[] = { 20, 19, 12, 12, 13, 13, 13, 0 };
precedence stack[MAX_STACK_SIZE];
int top = -1;
void push(precedence token) {
if (top >= MAX_STACK_SIZE - 1) {
fprintf(stderr, "stack overflow\n");
exit(1);
}
stack[++top] = token;
}
precedence pop() {
if (top < 0) {
fprintf(stderr, "stack underflow\n");
exit(1);
}
return stack[top--];
}
precedence get_token(char* symbol, int* n) {
*symbol = getchar();
switch (*symbol) {
case '(': return lparen;
case ')': return rparen;
case '+': return plus;
case '-': return minus;
case '*': return times;
case '/': return divide;
case '%': return mod;
case '\n': return eos;
default:
if (isdigit(*symbol)) {
int value = *symbol - '0';
while (isdigit(*symbol = getchar())) {
value = 10 * value + *symbol - '0';
}
*n = value;
ungetc(*symbol, stdin);
return operand;
} else {
fprintf(stderr, "invalid character: %c\n", *symbol);
exit(1);
}
}
}
int eval() {
precedence token;
char symbol;
int op1, op2, n;
token = get_token(&symbol, &n);
while (token != eos) {
if (token == operand) {
push(n);
} else {
op2 = pop();
op1 = pop();
switch (token) {
case plus: push(op1 + op2); break;
case minus: push(op1 - op2); break;
case times: push(op1 * op2); break;
case divide: push(op1 / op2); break;
case mod: push(op1 % op2); break;
}
}
token = get_token(&symbol, &n);
}
return pop();
}
int main() {
int result;
printf("Enter an expression: ");
result = eval();
printf("Result = %d\n", result);
return 0;
}
```
该程序使用了栈来处理运算符和操作数。首先,从标准输入读入一个字符,然后根据字符的类型判断是运算符还是操作数。如果是操作数,则将其压入栈中;如果是运算符,则从栈中弹出两个操作数,进行运算,并将结果压入栈中。最后,当输入的字符为换行符时,表示表达式结束,此时从栈中弹出的结果即为表达式的值。
阅读全文