比如中缀表达式1+(23)-5+6/2+(12/3)转化为逆波兰表达式的步骤
1 从左向右扫描中缀表达式。
2 首先扫描到1,将1放入到result中,
3 后扫描到+,将+放入到stack中,
4 后扫描到(,将(放入到stack中,
5 后扫描到2,将2放入到result中,
6 后扫描到*,如果扫描到的操作符的优先级大于stack栈顶元素的优先级,则把扫描到的操作符放到stack中,反之,则把栈顶元素放入到result中。。又已知 * 操作符的优先级大于+,则将*放入到stack中。
7后扫描到),把)放入栈中,并且把双括号中的操作符放入到result中。
8 后面的步骤与前面的类似。
import java.util.Stack;
public class Test {
public static void main(String[] args){
String s = "1+(2*3)-5+6/2+(1*2/3)";
changeInFixExpression(s.toCharArray());
}
//比较字符的优先级;
public static int Prioity(char c){
switch (c){
case '+': return 1;
case '-': return 1;
case '*': return 2;
case '/': return 2;
}
return 0;
}
//将中缀表达式转化为后缀表达式。
public static void changeInFixExpression(char a[]){
String result="";
Stack<Character> s1 = new Stack();
for(int i =0;i<a.length;i++){
//取出当前的字符。
char c = a[i];
//如果c字符是数字,直接加入到结果中。
if(Character.isDigit(c)){
result = result+c;
continue;
}
//如果栈为空,或者c是‘(’,或者c的优先级大于栈顶的优先级,则直接入集合(栈);
if(s1.empty()||c=='('||Prioity(c)>Prioity(s1.peek())){
s1.push(c);
continue;
}
//如果c是')',循环出栈并且将栈顶元素一个个都加入结果result中去,直到遇见了‘(’,且栈是非空的。
if(c==')'){
while(s1.peek()!='('&&!s1.empty()){
result = result+s1.peek();
s1.pop();
}
//此时的栈顶元素应该就是‘(’,则需要把他出栈。
s1.pop();
continue;
}
//如果字符c的优先级小于栈顶元素,则栈顶元素一个个出栈,并且跑到结果result中去,直到栈顶元素小于字符c。且栈是非空的。
while(!s1.isEmpty()&&Prioity(c)<=Prioity(s1.peek())){
result = result +s1.peek();
s1.pop();
}
//最终将字符c入栈。
s1.push(c);
}
//循环结束,如果此时的栈是非空的,则将栈中的元素加入到结果result中。
while(!s1.isEmpty()){
result = result + s1.peek();
s1.pop();
}
//打印出结果result中所有的元素。
System.out.println(result);
}
}