中缀转换为后缀。
准备一个StringBuffer用来记录结果,一个栈用来装符号。从左向右依次读取算术表达式的元素X,分以下情况进行不同的处理: (1)如果X是操作数,直接入队 (2)如果X是运算符,再分以下情况: a)如果栈为空,直接入栈。 b)如果X==”(“,直接入栈。 c)如果X==”)“,则将栈里的元素逐个出栈,并入队到后缀表达式队列中,直到第一个配对的”(”出栈。(注:“(”和“)”都不 入队) d)如果是其他操作符(+ - * /),则和栈顶元素进行比较优先级。 如果栈顶元素的优先级大于等于X,则出栈并把栈中弹出的元素入队,直到栈顶元素的优先级小于X或者栈为空。弹出完这些元素后,才将遇到的操作符压入到栈中。 (3)最后将栈中剩余的操作符全部入队。
import java.util.Stack; public class conversion { public static String INfixtosuffix(String s) { char[] arr = s.toCharArray(); Stack<Character> symbol = new Stack(); StringBuffer number = new StringBuffer(); for (char c : arr) { switch (c) { case '+': case '-': if (symbol.isEmpty() || symbol.peek() == '(') { symbol.push(c); break; } else { while (!symbol.isEmpty()) { if (symbol.peek() != '(') { number.append(symbol.pop()); } else { symbol.push(c); break; } } } if (symbol.isEmpty()) { symbol.push(c); } break; case '*': case '/': if (symbol.isEmpty() || symbol.peek() == '(') { symbol.push(c); break; } else { while (!symbol.isEmpty()) { if (symbol.peek() != '(') { if (symbol.peek() == '*' || symbol.peek() == '/') { number.append(symbol.pop()); } else { symbol.push(c); break; } } } }if (symbol.isEmpty()){ symbol.push(c); } break; case '(': symbol.push(c); break; case ')': while (symbol.peek()!='('){ number.append(symbol.pop()); } symbol.pop(); break; default: number.append(c); } } while (!symbol.isEmpty()){ number.append(symbol.pop()); } return new String(number); } public static void main(String[] args) { String result=INfixtosuffix("1+(2*3-4)/5"); System.out.println(result); } }