用C语言利用栈来完成下列表达式的求值: 3+3*(9-2*3)/3*(8-2*4)-9 要求:给出栈中数据的完整变化过程
时间: 2024-06-03 22:08:09 浏览: 12
首先将表达式转换成逆波兰式: 3 9 2 3 * - * 3 8 2 4 * - * 9 -
变化过程如下:
读入3,将其压入栈中,栈中元素为3
读入9,将其压入栈中,栈中元素为3 9
读入2,将其压入栈中,栈中元素为3 9 2
读入3,将其压入栈中,栈中元素为3 9 2 3
读入*,弹出栈顶两个元素3和3,计算3*3=9,将其压入栈中,栈中元素为9 9 2
读入-,弹出栈顶两个元素9和2,计算9-2=7,将其压入栈中,栈中元素为7 9
读入*,弹出栈顶两个元素7和9,计算7*9=63,将其压入栈中,栈中元素为63
读入3,将其压入栈中,栈中元素为63 3
读入*,弹出栈顶两个元素63和3,计算63*3=189,将其压入栈中,栈中元素为189
读入8,将其压入栈中,栈中元素为189 8
读入2,将其压入栈中,栈中元素为189 8 2
读入4,将其压入栈中,栈中元素为189 8 2 4
读入*,弹出栈顶两个元素2和4,计算2*4=8,将其压入栈中,栈中元素为189 8 8
读入-,弹出栈顶两个元素8和8,计算8-8=0,将其压入栈中,栈中元素为189 0
读入*,弹出栈顶两个元素189和0,计算189*0=0,将其压入栈中,栈中元素为0
读入9,将其压入栈中,栈中元素为0 9
读入-,弹出栈顶两个元素9和0,计算9-0=9,将其压入栈中,栈中元素为9
最终,栈中只剩下一个元素9,即为表达式的值。
相关问题
C语言实现利用栈来完成下列表达式的求值: 3+3*(9-2*3)/3*(8-2*4)-9 要求:给出栈中数据的完整变化过程
栈中数据变化过程如下:
1. 将3入栈
栈:3
2. 将3入栈
栈:3 3
3. 将9入栈
栈:3 3 9
4. 将2入栈
栈:3 3 9 2
5. 将3乘2再减去结果,即计算9-2*3=3,将3入栈
栈:3 3 3
6. 将3出栈
栈:3 3
7. 将3乘3,即计算3*3=9,将9入栈
栈:3 9
8. 将8入栈
栈:3 9 8
9. 将2入栈
栈:3 9 8 2
10. 将4乘2再减去结果,即计算8-2*4=0,将0入栈
栈:3 9 0
11. 将3出栈,将0出栈
栈:3 9
12. 将9乘3,即计算9*3=27,将27入栈
栈:3 27
13. 将3出栈
栈:27
14. 将27出栈
栈:空
15. 将-9入栈
栈:-9
最终结果为-9。
用算符优先法对4+2*3-10/5求值,用c语言写出来
算符优先法是一种用于将中缀表达式转换为后缀表达式并求值的算法。根据该算法,乘法和除法的优先级高于加法和减法,因此在转换为后缀表达式时需要先将乘法和除法的操作符放在前面。对于给定的表达式4+2*3-10/5,其对应的后缀表达式为4 2 3 * + 10 5 / -。
以下是用c语言实现算符优先法求解给定表达式的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// 定义操作符优先级
int priority(char op) {
switch(op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// 定义后缀表达式求值函数
int evalPostfix(char *postfix) {
int stack[MAX_SIZE];
int top = -1;
int i, a, b, c;
for(i = 0; i < strlen(postfix); i++) {
if(postfix[i] >= '0' && postfix[i] <= '9') {
stack[++top] = postfix[i] - '0';
} else {
b = stack[top--];
a = stack[top--];
switch(postfix[i]) {
case '+':
c = a + b;
break;
case '-':
c = a - b;
break;
case '*':
c = a * b;
break;
case '/':
c = a / b;
break;
}
stack[++top] = c;
}
}
return stack[top];
}
// 定义中缀表达式转后缀表达式函数
void infixToPostfix(char *infix, char *postfix) {
char stack[MAX_SIZE];
int top = -1;
int i, j;
for(i = 0, j = 0; i < strlen(infix); i++) {
if(infix[i] >= '0' && infix[i] <= '9') {
postfix[j++] = infix[i];
} else if(infix[i] == '(') {
stack[++top] = infix[i];
} else if(infix[i] == ')') {
while(stack[top] != '(') {
postfix[j++] = stack[top--];
}
top--;
} else {
while(top != -1 && priority(stack[top]) >= priority(infix[i])) {
postfix[j++] = stack[top--];
}
stack[++top] = infix[i];
}
}
while(top != -1) {
postfix[j++] = stack[top--];
}
postfix[j] = '\0';
}
int main() {
char infix[MAX_SIZE] = "4+2*3-10/5";
char postfix[MAX_SIZE];
infixToPostfix(infix, postfix);
printf("infix: %s\n", infix);
printf("postfix: %s\n", postfix);
printf("result: %d", evalPostfix(postfix));
return 0;
}
```
运行结果为:
```
infix: 4+2*3-10/5
postfix: 423*+105/-
result: 8
```