基本思路
1.遇到数字,直接输出,加入到后缀表达式中
2.遇到"(“直接入栈;遇到”)"依次弹出栈内运算符直到“(”。但是“(”不输出。
3.遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,加入后缀表达式中。碰到“(”或栈空则停止。再把当前运算符加入栈中。
4.最后输出栈中所有剩余运算符。
代码
#include <iostream>
#include <stdlib.h>
#include <stack>
#include <cstring>
using namespace std;
//判断是否为操作符
bool isOperator(char ch){
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')')return true;
return false;
}
int getPripority(char ch){
int level=0;
switch(ch){
case '(':
level=1;
break;
case '+':
case '-':
level=2;
break;
case '*':
case '/':
level=3;
break;
default:
break;
}
return level;
}
int main(){
string exp;
cin>>exp;
int len = exp.size();
stack<char> op;
for(int i=0;i<len;i++){
if(exp[i]==' ')continue;
if(isOperator(exp[i])){//处理运算符
int score=getPripority(exp[i]);
if(op.empty()||exp[i]=='('||score>getPripority(op.top())){ //左括号以及优先级大于栈顶的符号入栈
op.push(exp[i]);
}else{
while(!op.empty()&&getPripority(op.top())>=score){//栈顶运算符大于当前要入栈的运算符
if(op.top()=='('){//如果栈顶为左括号,那么停止并弹出有括号,表示括号内运算完毕
op.pop();
break;
}
cout<<op.top()<<" ";
op.pop();
}
if(exp[i]!=')')op.push(exp[i]); //加入当前运算符
}
}else{//不是操作符号
int num = 0;
do {
num = num * 10 + (exp[i] - '0'); // ch - 48根据ASCAII码,字符与数字之间的转换关系
i++; // 下一个字符
}while(i<len&&!isOperator(exp[i]));
cout<<num;
cout<<" ";
i--;//循环多走了一位,所以向前退一位
}
}
while(!op.empty())//处理完整个字符串之后把栈所有符号都输出
{
if(op.top()!='(')
cout<<op.top()<<" ";
op.pop();
}
return 0;
}