用c语言写算术表达式求值程序。演示程序和源程序已给出。用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/()。 编写源程序中的 double deal_exp (char *exp) 函数,对这个算术表达式求值,返回结果。要求用两个栈,一个储存数字,一个储存运算符
时间: 2023-12-17 11:02:02 浏览: 127
以下是用C语言实现算术表达式求值程序的源代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
typedef struct {
int top;
int data[MAX_STACK_SIZE];
} Stack;
void push(Stack *s, int x) {
if (s->top == MAX_STACK_SIZE - 1) {
printf("Stack overflow\n");
exit(1);
}
s->data[++s->top] = x;
}
int pop(Stack *s) {
if (s->top == -1) {
printf("Stack underflow\n");
exit(1);
}
return s->data[s->top--];
}
int is_empty(Stack *s) {
return s->top == -1;
}
int peek(Stack *s) {
return s->data[s->top];
}
int priority(char op) {
if (op == '+' || op == '-') {
return 1;
} else if (op == '*' || op == '/') {
return 2;
} else {
return 0;
}
}
double deal_exp(char *exp) {
Stack num_stack, op_stack;
int num = 0;
double result = 0.0;
int sign = 1;
num_stack.top = op_stack.top = -1;
while (*exp != '\0') {
if (isdigit(*exp)) {
num = num * 10 + (*exp - '0');
} else if (*exp == '-') {
if (isdigit(*(exp + 1))) {
sign = -1;
} else {
push(&num_stack, num * sign);
num = 0;
sign = 1;
}
} else {
push(&num_stack, num * sign);
num = 0;
sign = 1;
while (!is_empty(&op_stack) && priority(peek(&op_stack)) >= priority(*exp)) {
int b = pop(&num_stack);
int a = pop(&num_stack);
char op = pop(&op_stack);
switch (op) {
case '+':
push(&num_stack, a + b);
break;
case '-':
push(&num_stack, a - b);
break;
case '*':
push(&num_stack, a * b);
break;
case '/':
push(&num_stack, a / b);
break;
}
}
push(&op_stack, *exp);
}
exp++;
}
push(&num_stack, num * sign);
while (!is_empty(&op_stack)) {
int b = pop(&num_stack);
int a = pop(&num_stack);
char op = pop(&op_stack);
switch (op) {
case '+':
push(&num_stack, a + b);
break;
case '-':
push(&num_stack, a - b);
break;
case '*':
push(&num_stack, a * b);
break;
case '/':
push(&num_stack, a / b);
break;
}
}
result = pop(&num_stack);
if (!is_empty(&num_stack) || !is_empty(&op_stack)) {
printf("Invalid expression\n");
exit(1);
}
return result;
}
int main() {
char exp[100];
double result;
printf("Enter an expression: ");
scanf("%s", exp);
result = deal_exp(exp);
printf("Result: %g\n", result);
return 0;
}
```
该源代码中,首先定义了一个栈结构体和相关的栈操作函数。其中,push()函数用于将元素入栈,pop()函数用于将元素出栈,is_empty()函数用于判断栈是否为空,peek()函数用于返回栈顶元素的值,priority()函数用于返回运算符的优先级。
然后,定义了deal_exp()函数,该函数用于对算术表达式求值。该函数使用了两个栈,一个用于存储数字,一个用于存储运算符。在函数中,首先将num_stack和op_stack的top值初始化为-1,并定义了num、result和sign变量。num变量用于存储当前正在处理的数字,result变量用于存储最终的结果,sign变量用于存储数字的符号。
接下来,使用while循环遍历算术表达式的每个字符。如果遇到数字,则将其累加到num变量中;如果遇到负号,则判断下一个字符是否为数字,如果是,则将sign变量设为-1,否则将num变量入栈,并将sign变量设为1;如果遇到运算符,则将num变量入栈,并将num变量设为0和sign变量设为1。然后,使用while循环将op_stack中优先级高于或等于当前运算符的运算符弹出,并对num_stack中的数字进行相应的计算,直到op_stack为空或其栈顶运算符优先级低于当前运算符。最后,将当前运算符入op_stack栈。
当遍历完整个算术表达式后,将num变量入栈。然后,使用while循环将op_stack中的所有运算符弹出,并对num_stack中的数字进行相应的计算。最终,将num_stack中的最后一个数字作为结果返回,并检查num_stack和op_stack是否为空。如果不为空,则说明算术表达式不合法。
在main()函数中,首先从标准输入读取算术表达式,然后调用deal_exp()函数求值,并输出结果。
阅读全文