输入一个中缀表达式,利用栈结构求解表达式的值。其中运算符包括:+、-、*、/、(、),表达式以“=”为结尾,参与运算的数据为double类型且为正数。 输入样例: 20*(4.5-3) 输出结果: 30.00利用c语言编写程序,不使用指针
时间: 2023-11-08 07:30:10 浏览: 221
好的,以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_SIZE 100
double numStack[MAX_SIZE];
char opStack[MAX_SIZE];
int numTop = -1;
int opTop = -1;
// 将运算符入栈
void pushOp(char op) {
opStack[++opTop] = op;
}
// 将数字入栈
void pushNum(double num) {
numStack[++numTop] = num;
}
// 从栈中取出一个运算符
char popOp() {
return opStack[opTop--];
}
// 从栈中取出一个数字
double popNum() {
return numStack[numTop--];
}
// 获取栈顶运算符
char getTopOp() {
return opStack[opTop];
}
// 判断是否为运算符
int isOperator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')';
}
// 获取运算符优先级
int getPriority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// 计算表达式
double calculate() {
char op = popOp();
double num2 = popNum();
double num1 = popNum();
double result = 0;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
default:
break;
}
return result;
}
int main() {
char str[MAX_SIZE];
printf("请输入中缀表达式:");
scanf("%s", str);
int i = 0;
double num = 0;
while (str[i] != '=') {
if (isdigit(str[i])) { // 如果是数字
num = num * 10 + (str[i] - '0');
if (!isdigit(str[i + 1])) { // 如果数字已经结束
pushNum(num);
num = 0;
}
} else if (isOperator(str[i])) { // 如果是运算符
if (opTop == -1 || str[i] == '(') {
pushOp(str[i]);
} else if (str[i] == ')') {
while (getTopOp() != '(') {
pushNum(calculate());
}
popOp();
} else if (getPriority(str[i]) > getPriority(getTopOp())) {
pushOp(str[i]);
} else {
while (opTop != -1 && getPriority(str[i]) <= getPriority(getTopOp())) {
pushNum(calculate());
}
pushOp(str[i]);
}
}
i++;
}
while (opTop != -1) {
pushNum(calculate());
}
printf("计算结果为:%.2f\n", numStack[0]);
return 0;
}
```
该程序使用两个栈分别存储数字和运算符,并按照运算符的优先级进行计算。
阅读全文