写在前面,这里用的是我自己写的Stack类,并非STL,实现方法为静态数组,但使用过程中的函数方法一样,无伤大雅。(完整code和Stack_static类赋在最后)
中缀表达式转后缀表达式:
1.从左到右遍历
2.数,即参与运算数,直接放进后缀表达式之后
3.左括号,直接压入栈(因为括号的优先级最高,无需判断)(入栈后优先级最低,确保其它的符号正常入栈)
4.右括号,意味着括号已经结束,那么不断弹出栈顶,直到遇到左括号。
5.运算符,将该运算符与栈顶运算符进行比较
如果优先级高于栈顶运算符则压入堆栈
如果优先级低于或等于栈顶运算符则将栈顶运算符弹出并放入后缀表达式中
***这里是核心,低于或等于栈顶元素意味着前面部分可以运算了,先放入表达式,即先进行运算的一定是高优先级的运算符。
直到优先级大于栈顶运算符或者栈空,再将该运算符入栈。
6.对字符串处理完毕后,则按顺序弹出栈中所剩运算符,放入表达式中
这里我给出一个例子:2+(3*(4-1))+3
code中的栈类是我自己写的类,不是STL中的,但功能大致一样,
/*
返回运算符的优先级
*/
int value(char c){
switch(c){
case '(':
return 0;
break;
case '+':
case '-':
return 1;
break;
case '*':
case '/':
return 2;
break;
default:
cout<<"input error"<<endl;
return 0;
}
}
//将中缀表达式转化成后缀表达式
string change(string str){
string changed = "";
Stack_static s;
int opflag = 1;//记录运算符是否出现,用于判断-是负号还是减号。
for(int i = 0; i < int(str.length());i++){
if(str[i]>='0' && str[i]<='9'){//若为数字,则直接接到后缀表达式后面
changed += str[i];
opflag = 0;
}
else if(str[i]=='('){//若为左括号,直接压入栈
s.push(str[i]);
}
else if(str[i]==')'){//若为右括号,一直出栈接入后缀表达式,直到遇到左括号
while(s.top()!='('){
changed += ' ';
changed += s.top();
s.pop();
if(