前言
- 前两天有兴趣看看一些老算法,自己动手做了做,记一下过程中的小问题。
- 基础知识:
- 表达式:一个通用的算术或逻辑公式表示方法。
- 中缀表达式是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。
与前缀表达式(例:+ 3 4)或后缀表达式(例:3 4 +)相比,中缀表达式不容易被计算机解析,因为它符合人们的普遍用法。
与前缀或后缀记法不同的是,中缀记法中括号是必需的。计算过程中必须用括号将操作符和对应的操作数括起来,用于指示运算的次序。
示例
- 中缀表达式:3+4-5
- 后缀表达式:34+5-
- 前缀表达式:±543
中缀表达式转后缀表达式
- 中缀表达式转后缀表达式:
- 1、初始化两个栈:运算符栈S1和储存中间结果栈S2
- 2、从左至右扫描中缀表达式
- 3、遇到操作数时,将其压入栈S2
- 4、遇到运算符时,比较其与S1栈顶运算符的优先级
- 4.1、如果S1为空,或者栈顶元素为左括号,则直接将其压入S1
- 4.2、否则,若优先级比S1栈顶元素高,也将运算符压入S1(注意,相等和小于都不行)
- 4.3、否则,将S1栈顶的运算符压入到S2中,再次转到(4.1)与新的栈顶元素相比较
- 5、遇到括号时
- 5.1、如果是左括号,直接将其压入栈S1
- 5.2、如果是右括号,则依次弹出栈S1中的元素,直到遇到右括号为止,并将这对括号废除掉
- 6、重复上述2~5的步骤,直到扫描到表达式的最右边
- 代码实现:
public static void main(String[] args) {
Stack<String> S1 = new Stack();
Stack<String> S2 = new Stack();
Map<String,Integer> operator = new HashMap();
operator.put("+", 1);
operator.put("-", 1);
operator.put("*", 2);
operator.put("/", 2);
operator.put("(", -1);
operator.put(")", -2);
String input = "(6+4)/2*3";
for(int i=0;i<input.length();i++) {
String uN = String.valueOf(input.charAt(i));
if(!operator.containsKey(uN)) {
S2.add(uN);
continue;
}else if(operator.get(uN)>0){
while(true) {
if(S1.isEmpty() || operator.get(S1.peek())==-1