对于简易的四则运算,需要知道的也是最重要的一点就是:先乘除后加减,所以就不可以从左到右依次计算,要将输入的中缀表达式转换成后缀表达式。
不会这一方法的可以先看我的这篇博客了解一下。
思路:
将输入的表达式中的数字放到一个栈,再把运算符放到一个栈,
由于先加减后乘除的特性,所以我要比较运算符的等级,然后再决定是否放入栈内。如果要判断的运算符的优先级小于栈顶所存放的运算符的优先级,则取出数字栈中的上面两个数字进行运算,然后将结果放入数字栈内;如果要判断的运算符优先级大于运算符栈顶存放的运算符的优先级,则把它入栈。这里我用“#”符号表示输入表达式的结束。
demo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Calculate(int a, int b, char c);
int Compare(char c);
int main() {
int dataStack[100] = {
0};//存放数字的栈
int dataTop = -1;
char operatorStack[100] = {
'#'};//存放运算符的栈
int operatorTop = 0;
char str[100];
scanf("%s", str);
int length = (int)strlen(str);
int i = 0, flag = 0, x = 0;
while(i < length) {
if (str[i] >= '0' && str[i] <= '9') {
//计算输入的是几位数
x = x * 10 + (str[i++] - '0');
flag = 1;
} else {
if (flag == 1) {
dataStack[++dataTop] = x;
x = 0;
flag = 0;
}
if (Compare(operatorStack[operatorTop]) < Compare(str[i])) {
operatorStack[++operatorTop] = str[i++];
} else {
int b = dataStack[dataTop--];
int a = dataStack[dataTop--];
dataStack[++dataTop] = Calculate(a, b, operatorStack[operatorTop--]);
if (str[i] == '#' && operatorTop == 0) {
break;
}
}
}
}
printf("%d\n", dataStack[dataTop]);
}
int Calculate(int a, int b, char c) {
if (c == '-') {
return a - b;
} else if (c == '+') {
return a + b;
} else if (c == '*') {
return a * b;
} else if (c == '/') {
return a / b;
} else {
return 0;
}
}
int Compare(char c) {
if (c == '#') {
return 0;
} else if (c == '+' || c == '-') {
return 1;
} else if (c == '*' || c == '/') {
return 2;
} else {
printf("输入有误,请重新输入!\n");
return -1;
}
}