设计一个C语言程序,用算符优先法对算术表达式求值。
时间: 2024-05-16 20:16:39 浏览: 164
设计一个程序,演示用算符优先法对算术表达式求值的过程
3星 · 编辑精心推荐
以下是一个简单的算符优先法求值的C语言程序示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
#define MAX_EXPR_SIZE 100
// 定义运算符优先级
int priority(char c) {
switch(c) {
case '+': case '-': return 1;
case '*': case '/': return 2;
case '(': case ')': return 3;
default: return 0;
}
}
// 实现运算符栈
char op_stack[MAX_STACK_SIZE];
int op_top = -1;
void push_op(char c) {
op_stack[++op_top] = c;
}
char pop_op() {
return op_stack[op_top--];
}
char top_op() {
return op_stack[op_top];
}
int is_empty_op() {
return op_top == -1;
}
// 实现数字栈
double num_stack[MAX_STACK_SIZE];
int num_top = -1;
void push_num(double num) {
num_stack[++num_top] = num;
}
double pop_num() {
return num_stack[num_top--];
}
double top_num() {
return num_stack[num_top];
}
int is_empty_num() {
return num_top == -1;
}
// 实现计算表达式的函数
double eval(char *expr) {
char *p = expr;
char c;
double num, num1, num2;
while (*p != '\0') {
// 如果是数字,将其入数字栈
if (isdigit(*p)) {
num = 0;
while (isdigit(*p)) {
num = num * 10 + (*p - '0');
p++;
}
push_num(num);
}
// 如果是运算符
else if (*p == '+' || *p == '-' || *p == '*' || *p == '/') {
// 如果运算符栈为空或栈顶元素为左括号,直接入栈
if (is_empty_op() || top_op() == '(') {
push_op(*p);
p++;
continue;
}
// 否则比较优先级
if (priority(*p) > priority(top_op())) {
push_op(*p);
p++;
} else {
// 弹出运算符栈顶元素,并弹出数字栈两个元素进行计算
c = pop_op();
num2 = pop_num();
num1 = pop_num();
switch(c) {
case '+': push_num(num1 + num2); break;
case '-': push_num(num1 - num2); break;
case '*': push_num(num1 * num2); break;
case '/': push_num(num1 / num2); break;
}
}
}
// 如果是左括号,直接入运算符栈
else if (*p == '(') {
push_op(*p);
p++;
}
// 如果是右括号,弹出运算符栈中的元素并弹出数字栈两个元素进行计算,直至遇到左括号
else if (*p == ')') {
while (top_op() != '(') {
c = pop_op();
num2 = pop_num();
num1 = pop_num();
switch(c) {
case '+': push_num(num1 + num2); break;
case '-': push_num(num1 - num2); break;
case '*': push_num(num1 * num2); break;
case '/': push_num(num1 / num2); break;
}
}
pop_op(); // 弹出左括号
p++;
} else {
p++;
}
}
// 如果运算符栈中还有元素,继续弹出并计算
while (!is_empty_op()) {
c = pop_op();
num2 = pop_num();
num1 = pop_num();
switch(c) {
case '+': push_num(num1 + num2); break;
case '-': push_num(num1 - num2); break;
case '*': push_num(num1 * num2); break;
case '/': push_num(num1 / num2); break;
}
}
return pop_num(); // 最后数字栈中剩余的元素即为表达式的值
}
int main() {
char expr[MAX_EXPR_SIZE];
printf("请输入一个算术表达式:");
scanf("%s", expr);
double result = eval(expr);
printf("%s = %.2f\n", expr, result);
return 0;
}
```
该程序可以读入一个算术表达式并输出其求值结果。例如,输入表达式 "3+4*2/(1-5)^2",程序将输出结果 "-3.50"。
阅读全文