Zhao70's Blog

infixToSuffixExpresion

中缀表达式转后缀表达式

思路

将中缀表达式读入字符串, 不断读入字符。
若字符为数字, 则直接打印
若字符为运算符, 若栈顶元素运算的优先级高于读入的运算符的优先级, 则弹出栈顶元素, 压栈读入的运算符。
需要特殊说明的是括号的优先级, 左括号压栈之前的优先级最高(括号的读取不能使任何之前的运算符进行出栈操作, 即所有操作都要等待括号的运算完成), 在栈中优先级最低(在括号中, 括号的存在不能影响任何括号内的运算)。

代码实现

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
import java.util.HashMap;
import java.util.Scanner;
import java.util.Stack;
public class infixToSuffixExpresion {
public static void main(String[] args)
{
// (的优先级在栈中最低, 但没必要另建一个表
HashMap<Character, Integer> priorty = new HashMap<Character, Integer>();
priorty.put('(', 0);
priorty.put('+', 1);
priorty.put('-', 1);
priorty.put('*', 2);
priorty.put('/', 2);
Scanner in = new Scanner(System.in);
String infix = in.next();
StringBuilder ans = new StringBuilder();
Stack<Character> oper = new Stack<Character>();
for(int i = 0; i < infix.length(); ++i)
{
Character c = infix.charAt(i);
if(c >= '0' && c <= '9')
{
ans.append(c);
continue;
}
if(true == oper.isEmpty())
{
oper.push(c);
continue;
}
if(c == '(')
{
oper.push(c);
}
else if(')' == c)
{
while(oper.peek() != '(')
{
ans.append(oper.peek());
oper.pop();
}
oper.pop();
}
else if(priorty.get(oper.peek()) >= priorty.get(c))
{
ans.append(oper.peek());
oper.pop();
oper.push(c);
}
else if(priorty.get(oper.peek()) < priorty.get(c))
{
oper.push(c);
}
}
while(oper.empty() == false)
{
ans.append(oper.peek());
oper.pop();
}
System.out.println(ans);
//System.out.println(oper.toString());
in.close();
}
}