C语言源代码实现设计一个程序,用算符优先法对算术表达式求值
时间: 2024-05-06 11:16:36 浏览: 142
用算符优先法对算术表达式求值
5星 · 资源好评率100%
以下是一个使用算符优先法对算术表达式求值的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define STACK_SIZE 100
typedef enum {
lparen,
rparen,
plus,
minus,
times,
divide,
mod,
eos,
operand
} precedence;
int stack[STACK_SIZE];
int top = -1;
char expr[STACK_SIZE];
precedence getToken(char *symbol, int *n);
precedence getPriority(precedence x);
void push(int item);
int pop();
int eval();
int main() {
int result;
printf("Enter an infix expression: ");
scanf("%s", expr);
result = eval();
printf("Result = %d\n", result);
return 0;
}
precedence getToken(char *symbol, int *n) {
*symbol = expr[(*n)++];
switch (*symbol) {
case '(':
return lparen;
case ')':
return rparen;
case '+':
return plus;
case '-':
return minus;
case '*':
return times;
case '/':
return divide;
case '%':
return mod;
case '\0':
return eos;
default:
return operand;
}
}
precedence getPriority(precedence x) {
switch (x) {
case lparen:
return 0;
case rparen:
return 0;
case plus:
return 1;
case minus:
return 1;
case times:
return 2;
case divide:
return 2;
case mod:
return 2;
case eos:
return -1;
default:
return 0;
}
}
void push(int item) {
if (top >= STACK_SIZE - 1) {
printf("Stack Overflow\n");
exit(1);
}
stack[++top] = item;
}
int pop() {
if (top < 0) {
printf("Stack Underflow\n");
exit(1);
}
return stack[top--];
}
int eval() {
precedence token;
char symbol;
int n = 0;
int op1, op2;
token = getToken(&symbol, &n);
while (token != eos) {
if (token == operand) {
push(symbol - '0');
} 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 = getToken(&symbol, &n);
}
return pop();
}
```
该程序中,`getToken`函数用于获取下一个符号,并将其转换为对应的优先级常量,`getPriority`函数返回指定运算符的优先级常量,`push`和`pop`函数分别用于向栈中添加元素和从栈中取出元素,`eval`函数则使用算符优先法对表达式求值。在`eval`函数中,我们首先获取表达式中的第一个符号,然后进入一个循环中,不断获取下一个符号并进行计算,直到最后一个符号为`eos`(即表达式结束符)。对于每个运算符,我们从栈中弹出两个操作数,并将计算结果压入栈中。最终,我们从栈中取出最后的计算结果并返回。
阅读全文