实现目的:假设表达式由数字和双目四则运算符+,-,,/构成。试利用栈实现一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式(后缀表达式),同时将转换后的逆波兰式求值,最后仅需输出求值结果。假设表达式由数字和双目四则运算符+,-,,/构成。试利用栈实现一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式(后缀表达式),同时将转换后的逆波兰式求值,最后仅需输出求值结果。
#include <cstdio>
#include <iostream>
using namespace std;
int getNum(char *str, int *ret) {//处理隐藏的最高结合权限:连续的数字
int i = 0, num = 0;
while (str[i] <= '9' && str[i] >= '0') {
num = num * 10 + str[i++] - '0';
}
*ret = num;
return i;
}
int getTerm(char *str, int *ret) {//处理乘除法
int i = 0, temp;
if (str[i] == 0) return 0;
i += getNum(str + i, ret);
if (str[i] == 0) return i;
while (str[i]) {
switch (str[i]) {
case '*' : {
i += getNum(str + i + 1, &temp) + 1;
*ret *= temp;
} break;
case '/' : {
i += getNum(str + i + 1, &temp) + 1;
*ret /= temp;
} break;
default : return i;
}
}
return i;
}
int calc(char *str) {//处理加减法
int i = 0, a, b;
char op;
if (str[i] == 0) return 0;
i += getTerm(str, &a);
if (str[i] == 0) return a;
while (str[i]) {
op = str[i];
i += getTerm(str + i + 1, &b) + 1;
switch(op) {
case '+' : a += b; break;
case '-' : a -= b; break;
}
}
return a;
}
int main() {
char str[1000];
scanf("%s", str);
printf("%d\n",calc(str));
return 0;
}
网友评论