本文实例讲述了java数据结构与算法之中缀表达式转为后缀表达式的方法。分享给大家供大家参考,具体如下:
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
|
//stack public class StackX { private int top; private char [] stackArray; private int maxSize; //constructor public StackX( int maxSize){ this .maxSize = maxSize; this .top = - 1 ; stackArray = new char [ this .maxSize]; } //put item on top of stack public void push( char push){ stackArray[++top] = push; } //take item from top of stack public char pop(){ return stackArray[top--]; } //peek the top item from stack public char peek(){ return stackArray[top]; } //peek the character at index n public char peekN( int index){ return stackArray[index]; } //true if stack is empty public boolean isEmpty(){ return (top == - 1 ); } //return stack size public int size(){ return top+ 1 ; } } //InToPost public class InToPost { private StackX myStack; private String input; private String outPut= "" ; //constructor public InToPost(String input){ this .input = input; myStack = new StackX( this .input.length()); } //do translation to postFix public String doTrans(){ for ( int i= 0 ; i<input.length(); i++){ char ch = input.charAt(i); switch (ch){ case '+' : case '-' : this .getOper(ch, 1 ); break ; case '*' : case '/' : this .getOper(ch, 2 ); break ; case '(' : this .getOper(ch, 3 ); break ; case ')' : this .getOper(ch, 4 ); break ; default : this .outPut = this .outPut + ch; } } while (! this .myStack.isEmpty()){ this .outPut = this .outPut + this .myStack.pop(); } return this .outPut; } //get operator from input public void getOper( char ch, int prect1){ char temp; if ( this .myStack.isEmpty()||prect1== 3 ){ this .myStack.push(ch); } else if (prect1== 4 ){ while (! this .myStack.isEmpty()){ temp = this .myStack.pop(); if (temp== '(' ) continue ; this .outPut = this .outPut + temp; } } else if (prect1== 1 ){ temp = this .myStack.peek(); if (temp== '(' ) this .myStack.push(ch); else { this .outPut = this .outPut + this .myStack.pop(); this .myStack.push(ch); } } else { temp = this .myStack.peek(); if (temp== '(' ||temp== '+' ||temp== '-' ) this .myStack.push(ch); else { this .outPut = this .outPut + this .myStack.pop(); } } } } //Test public class TestInToPost { private static InToPost inToPost; private static String str; public static void main(String []args){ str = "((A+B)*C)-D" ; inToPost = new InToPost(str); System.out.println(inToPost.doTrans()); } } |
PS:算法实现不是很完善,有些复杂的表达式解析要出错,写出来做个纪念!
希望本文所述对大家java程序设计有所帮助。