简介
后缀表达式也叫逆波兰表达式,主要是用来进行表达式运算的。数学中对表达式进行求解,都是使用中缀表达式,如:2 * (3 + 4) - 5
这易于人们理解,但是不易于程序编写。在编写程序进行表达式求解时,一般都是先将表达式由中缀表达式转成后缀表达式,再结合栈进行求解。因为后缀表达式可以直接取出括号而对结果没有影响。例如:中缀表达式 2 * (3 + 4) - 5
,其对应的后缀表达式为 2 ( 3 4 + ) * 5 -
,可以简写为 2 3 4 + * 5 -
算法
将中缀表达式转成后缀表达式的算法如下:
例子
一个简单的例子代码如下,假设输入的表达式是合法的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| import java.util.ArrayList; import java.util.List; import java.util.Stack;
public class TestRpn {
public List<String> convertInOrder2PostOrder(String exp) { Stack<Character> opStack = new Stack<>(); List<String> result = new ArrayList<>(); int num = 0; boolean isAddNum = false; boolean isNegative = false; for (int i = 0; i < exp.length(); i++) { char ch = exp.charAt(i); if (Character.isDigit(ch)) { isAddNum = true; num = num * 10 + (ch - '0'); continue; }
if (isAddNum) { if (isNegative) { result.add(String.valueOf(-num)); } else { result.add(String.valueOf(num)); } num = 0; isAddNum = false; isNegative = false; }
if (ch == '(') { opStack.push(ch); } else if (ch == ')') { while (!opStack.isEmpty() && opStack.peek() != '(') { result.add(String.valueOf(opStack.pop())); } opStack.pop(); } else { if (ch == '-' && (i == 0 || (!Character.isDigit(exp.charAt(i - 1)) && exp.charAt(i - 1) != ')'))) { isNegative = true; continue; }
while (!opStack.isEmpty() && !isHigh(ch, opStack.peek())) { result.add(String.valueOf(opStack.pop())); } opStack.push(ch); }
}
if (isAddNum) { if (isNegative) { result.add(String.valueOf(-num)); } else { result.add(String.valueOf(num)); } } while (!opStack.isEmpty()) { result.add(String.valueOf(opStack.pop())); }
return result; }
private boolean isHigh(char firstOp, char secondOp) { if (secondOp == '(') { return true; }
return (firstOp == '*' || firstOp == '/') && (secondOp == '+' || secondOp == '-'); }
public static void main(String[] args) { String exp = "32*9/3+(233-31)*8"; System.out.println(new TestRpn().convertInOrder2PostOrder(exp)); } }
|