利用中缀表达式计算表达式
代码如下:
#include <iostream>
#include <stack>
using namespace std;
int get_isp(char ch){
if (ch == '(') return 1;
else if (ch == '+' || ch == '-') return 2;
else if (ch == '*' || ch == '/') return 3;
else if(ch == ')') return 4;
else return 0;
}
int get_icp(char ch){
if (ch == ')') return 1;
else if (ch == '+' || ch == '-') return 2;
else if (ch == '*' || ch == '/') return 3;
else if(ch == '(') return 4;
else return 0;
}
int is_operator(char ch){
if(ch - '0' >= 0 && ch - '0' <= 9){ //数字
return 0;
}
else if(ch == '#' || ch == '+' || ch == '-' || ch == '*' || ch == '/' ||ch == '(' || ch == ')'){ //运算符号
return 1;
}
else{
return -1; //非法字符
}
}
int compute(int a, int b, char _operator)
{
switch(_operator)
{
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
return 0;
}
}
void calculator(){
stack<int> OPND; //数值栈
stack<char> OPTR; //符号栈
int i, j, a, b, res;
char ch, top;
ch = getchar();
OPTR.push('#');
OPND.push(0); //处理首位为一元运算符的情况
while(ch != '#' || OPTR.top() != '#'){ //当算式没有结束 或 符号栈还有计算符号时执行
if(!is_operator(ch)){ //如果是数字 入数字栈
int m, n;
n = ch - '0';
ch = getchar();
while(!is_operator(ch)){
m = ch - '0';
n = n * 10 + m;
ch = getchar();
}
OPND.push(n); //入栈
continue;
}
else if(is_operator(ch) != -1){ //如果为运算符号 进一步判断
top = OPTR.top(); //获取栈顶元素
i = get_isp(top); j = get_icp(ch); //获取优先级 i代表栈内元素 j代表栈外元素
if(i < j){ //如果栈内元素优先级小于栈外元素优先级 入符号栈
OPTR.push(ch); //入符号栈
if(top == '(' && (ch == '-' || ch == '-')){ //一元运算符在'('之后的情况
ch = getchar();
if(is_operator(ch)) continue; //如果下一位是符号 那么进行下一轮判断
else OPND.push(0); //如果是数字 将0压入数值栈 0 + num = num , 0 - num = -num
}
}
else{
OPTR.pop();
if(top != '(' && i == j || i > j){ //如果i >= j并且弹出的元素不是'(' 从数值栈弹出两个元素进行运算 并将结果入栈
b = OPND.top();
OPND.pop();
a = OPND.top();
OPND.pop();
OPND.push(compute(a, b, top));
continue; //继续计算
}
}
}
ch = getchar();
}
res = OPND.top();
cout << "计算结果为:" << res << endl;
}
int main(){
calculator();
}