c语言算术表达式求值。演示程序和源程序已给出。用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/()。 编写源程序中的 double deal_exp (char *exp) 函数,对这个算术表达式求值,返回结果。不限制方法,你可以用“原始”的多遍扫描字符串,也可以用先进一点的栈
时间: 2023-12-14 07:38:47 浏览: 143
c语言算术表达式,加减乘除、乘方、括号。依次输出在求值过程中运算数栈内的栈顶数据变化过程,并最终输出表达式的值
5星 · 资源好评率100%
以下是使用栈实现算术表达式求值的源程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_STACK_SIZE 100
#define MAX_EXPRESSION_SIZE 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];
char expr[MAX_EXPRESSION_SIZE];
int top = -1;
void push(int item) {
if (top >= MAX_STACK_SIZE - 1) {
printf("stack_full\n");
exit(EXIT_FAILURE);
} else stack[++top] = item;
}
precedence pop() {
if (top == -1) {
printf("stack_empty\n");
exit(EXIT_FAILURE);
} else return stack[top--];
}
precedence get_token(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;
}
}
double deal_expression(char *exp) {
precedence token;
char symbol;
int n = 0;
int top = 0;
int op1, op2;
double result;
stack[0] = eos;
for (token = get_token(&symbol, &n); token != eos; token = get_token(&symbol, &n)) {
if (token == operand) {
push(atoi(&symbol));
} 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;
}
}
}
result = pop();
return result;
}
int main() {
printf("Enter an expression: ");
scanf("%s", expr);
printf("Result: %lf\n", deal_expression(expr));
return 0;
}
```
该程序的核心函数是 `deal_expression`,它使用了一个栈来实现表达式求值。算法的基本思想是:
1. 从左到右扫描表达式,逐个取出表达式中的符号。
2. 如果符号是操作数,则将其压入栈中。
3. 如果符号是运算符,则从栈中弹出两个操作数,对它们进行运算,并将结果压入栈中。
4. 重复步骤 2 和 3,直到扫描完整个表达式。
值得注意的是,该程序使用了两个数组 `isp` 和 `icp` 来存储运算符的优先级信息。其中,`isp` 数组用于存储运算符的栈内优先级,`icp` 数组用于存储运算符的栈外优先级。在程序中,我们使用 `isp` 和 `icp` 数组来比较运算符的优先级,以便确定何时进行运算。
需要注意的是,该程序仅支持整数的四则运算和取模运算,不支持浮点数运算。如果需要支持浮点数运算,需要对程序进行适当地修改。
阅读全文