;
break;
}
}
}
// 规则6
while (stackLen >= 0) {
printf("%c",options[stackLen]);
stackLen--;
}
printf("\n");
}
执行结果
# gcc calTest1.c
# ./a.out
3+2*(9+8)/3*(3/5)
3298+*3/35/*+
#
4. 利用栈 后缀表达式计算结果利用栈计算后缀表达式规则如下
假设后缀表达式是有效的
遍历后缀表达式
实际例子
通过栈,将计算后缀表达式 3298+*3/35/*+ 的值
式子: 3298+*3/35/*+
开始处理: 3
执行规则1: 直接入栈
栈: 3
开始处理: 2
执行规则1: 直接入栈
栈: 3 2
开始处理: 9
执行规则1: 直接入栈
栈: 3 2 9
开始处理: 8
执行规则1: 直接入栈
栈: 3 2 9 8
开始处理: +
执行规则2: 取出2个元素, m:8 n:9 , 并且执行结果(n + m)入栈
栈: 3 2 17
开始处理: *
执行规则2: 取出2个元素, m:17 n:2 , 并且执行结果(n * m)入栈
栈: 3 34
开始处理: 3
执行规则1: 直接入栈
栈: 3 34 3
开始处理: /
执行规则2: 取出2个元素, m:3 n:34 , 并且执行结果(n / m)入栈
栈: 3 11.3
开始处理: 3
执行规则1: 直接入栈
栈: 3 11.3 3
开始处理: 5
执行规则1: 直接入栈
栈: 3 11.3 3 5
开始处理: /
执行规则2: 取出2个元素, m:5 n:3 , 并且执行结果(n / m)入栈
栈: 3 11.3 0.6
开始处理: *
执行规则2: 取出2个元素, m:0.6 n:11.3 , 并且执行结果(n * m)入栈
栈: 3 6.8
开始处理: +
执行规则2: 取出2个元素, m:6.8 n:3 , 并且执行结果(n + m)入栈
栈: 9.8
计算结果: 9.8
完成
用C实现该代码
转换代码 C语言实现:
# include <stdio.h>
int main() {
// 后缀表达式
char formula[] = "3298+*3/35/*+";
// 栈
float options[sizeof(formula) * sizeof(char)];
int stackLen = -1;
printf("%s\n",formula);
int i;
for(i=0;formula!='\0';i++) {
// 规则1
if (formula >= '0' && formula <= '9') {
stackLen++;
options[stackLen] = (float)(formula-48);
} else {
// 规则2
float m = options[stackLen];
stackLen--;
float n = options[stackLen];
stackLen--;
switch (formula) {
case '*': {
stackLen++;
options[stackLen] = (n * m);
break;
}
case '/': {
stackLen++;
options[stackLen] = (n / m);
break;
}
case '+': {
stackLen++;
options[stackLen] = (n + m);
break;
}
case '-': {
stackLen++;
options[stackLen] = (n - m);
break;
}
}
}
}
printf("\n结果为: %.2f\n" , options[0]);
}
执行结果
# ./a.out
3298+*3/35/*+
结果为: 9.80
#