1
+ #include < iostream>
2
+ #include < vector>
3
+ #include < algorithm>
4
+ using namespace std ;
5
+
6
+ struct Expression {
7
+ string type;
8
+ bool valid;
9
+ };
10
+ Expression *expression (string expression){
11
+ Expression *exp = new Expression;
12
+ bool strExp = expression.find_first_not_of (" (+-*/^) abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ) == string::npos;
13
+ bool numExp = expression.find_first_not_of (" (+-*/^) 0123456789" ) == string::npos;
14
+
15
+ if (strExp && !numExp){
16
+ exp ->type = " alphabetic" ;
17
+ } else if (numExp && !strExp){
18
+ exp ->type = " numeric" ;
19
+ } else {
20
+ exp ->type = " !" ;
21
+ }
22
+ exp ->valid = (strExp || numExp) && (strExp != numExp);
23
+ return exp ;
24
+ }
25
+
26
+ struct Bracket {
27
+ int open = -1 , close = -1 ,length = 0 ;
28
+ bool valid = false ;
29
+ };
30
+
31
+ Bracket *bracketInfo (string exp){
32
+ Bracket *bracket = new Bracket;
33
+ bracket->open = exp .find_first_of (' (' );
34
+ bracket->close = exp .find_last_of (' )' );
35
+ bracket->length = bracket->close - bracket->open ;
36
+ if (~bracket->open && ~bracket->close && (bracket->close > bracket->open )){
37
+ bracket->valid = true ;
38
+ ++bracket->length ;
39
+ }
40
+ return bracket;
41
+ }
42
+
43
+ bool isBracket (char data){
44
+ return (data == ' (' || data == ' )' );
45
+ }
46
+
47
+ bool isOperator (char data){
48
+ return (data == ' +' || data == ' -' || data == ' *' || data == ' /' || data == ' ^' );
49
+ }
50
+
51
+ bool isOperand (char data){
52
+ return (data >= ' a' && data <= ' z' ) || (data >= ' A' && data <= ' Z' );
53
+ }
54
+
55
+ int priortiy (vector<string> v, string request = " " ){
56
+ int bID, exp , mul, div , add, sub, count = 0 ;
57
+ bID = exp = mul = div = add = sub = -1 ;
58
+ for (int i = 0 ; i < v.size (); i++){
59
+ char opr = (v[i].length () == 1 ) ? v[i][0 ] : ' \0 ' ;
60
+ Bracket *bracket = new Bracket;
61
+ bracket = bracketInfo (v[i]);
62
+ if (!isOperator (opr) && bracket->length > 0 && bracket->valid ){
63
+ bID = i;
64
+ } else if (isOperator (opr) && ((bracket->valid && bracket->length > 1 && (i < bracket->open && i > bracket->close )) || (bracket->open == -1 && bracket->close == -1 ))){
65
+ count++;
66
+ if (exp == -1 && opr == ' ^' ) exp = i;
67
+ if (mul == -1 && opr == ' *' ) mul = i;
68
+ if (div == -1 && opr == ' /' ) div = i;
69
+ if (add == -1 && opr == ' +' ) add = i;
70
+ if (sub == -1 && opr == ' -' ) sub = i;
71
+ }
72
+ }
73
+
74
+ if (request == " index" ){
75
+ if (bID >= 0 ){
76
+ return bID;
77
+ } else if (exp > 0 ){
78
+ return exp ;
79
+ } else if (mul > 0 || div > 0 ){
80
+ if (mul > 0 && div > 0 ){
81
+ return (mul < div ) ? mul : div ;
82
+ } else {
83
+ return (mul > 0 && div < 0 ) ? mul : div ;
84
+ }
85
+ } else if (add > 0 || sub > 0 ){
86
+ if (add > 0 && sub > 0 ){
87
+ return (add < sub) ? add : sub;
88
+ } else {
89
+ return (add > 0 && sub < 0 ) ? add : sub;
90
+ }
91
+ }
92
+ } else if (request == " count" ){
93
+ return count;
94
+ }
95
+ return -1 ;
96
+ }
97
+
98
+ string concatenateVector (vector<string> data){
99
+ string result;
100
+ bool error = false ;
101
+ for (int i = 0 ; i < data.size (); i++){
102
+ if (data[i][0 ] == ' !' ){
103
+ result = " !" ;
104
+ error = true ;
105
+ break ;
106
+ } else if (!error){
107
+ if (i == 0 && data[i].length () == 1 && isOperator (data[i][0 ])) data[i] += " " ;
108
+ result.append (data[i]);
109
+ }
110
+ }
111
+ return result;
112
+ }
113
+
114
+
115
+ string prefix (string infix){
116
+ vector<string> result;
117
+ Bracket *bracket = new Bracket;
118
+ Expression *exp = new Expression;
119
+ bracket = bracketInfo (infix);
120
+ exp = expression (infix);
121
+ bool error = (!exp ->valid || infix == " !" ) ? true : false ;
122
+
123
+ string operand = " " , number = " " ;
124
+ char data;
125
+ if (error || (bracket->length && !bracket->valid )){
126
+ error = true ;
127
+ } else {
128
+ // Check if the bracket last charecter is operator
129
+ if (bracket->close > 0 && bracket->length > 1 && isOperator (infix[bracket->close -1 ])){
130
+ swap (infix[bracket->close ], infix[bracket->close -1 ]);
131
+ bracket->close --;
132
+ bracket->length --;
133
+ }
134
+
135
+ // If infixression starts with operator or first operand has a visible operator
136
+ int initOperator = (infix.length () > 1 && isOperator (infix[0 ]) && isOperand (infix[1 ])) ? true : false ;
137
+
138
+ // ----- Split the infix exression ----- //
139
+ for (int i = 0 ; i < infix.length (); i++){
140
+ data = infix[i];
141
+ if (bracket->length > 0 && i == bracket->open ){
142
+ result.push_back (infix.substr (i, bracket->length ));
143
+ i += bracket->length -1 ;
144
+ } else if (isOperand (data) && exp ->type == " alphabetic" ){
145
+ operand += string (1 , data) + " " ;
146
+ if (operand.length () > 0 && (i == infix.length ()-1 || isOperator (infix[i+1 ]))){
147
+ result.push_back (operand);
148
+ operand = " " ;
149
+ }
150
+ } else if (isdigit (data) && exp ->type == " numeric" ) {
151
+ number += data;
152
+ if (i == infix.length ()-1 ) result.push_back (number + " " );
153
+ } else if (isOperator (data) || data == ' ' ) {
154
+ if (number.length () > 0 ) result.push_back (number + " " ); number = " " ;
155
+
156
+ if (isOperator (data)){
157
+ if (i == 0 && initOperator) {
158
+ operand += string (1 , data) + " " ;
159
+ } else {
160
+ result.push_back (string (1 , data));
161
+ }
162
+ }
163
+ } else {
164
+ error = true ;
165
+ break ;
166
+ }
167
+ }
168
+
169
+
170
+ data = ' \0 ' ;
171
+ // ----- Iterate the vector and process the expression ----- //
172
+ if (!error){
173
+ int operators = priortiy (result, " count" );
174
+ for (int i = 0 ; i <= operators; i++){
175
+ int opID = priortiy (result, " index" ); // Operator ID
176
+ if (opID > 0 ){
177
+ string vExp = result[opID];
178
+ Bracket *vBracket = new Bracket;
179
+
180
+ string excludedBracket = vExp;
181
+ if (vExp[0 ] == ' (' && vExp[vExp.length ()-1 ] == ' )' ){
182
+ excludedBracket = vExp.substr (1 , vExp.length ()-2 );
183
+ }
184
+
185
+ vBracket = bracketInfo (excludedBracket);
186
+ if (!vBracket->valid && vBracket->length > 0 ){
187
+ error = true ;
188
+ break ;
189
+ } else if (vBracket->valid ){
190
+ result[opID] = prefix (excludedBracket);
191
+ } else {
192
+ if (opID != 0 && isOperator (vExp[1 ]) && result.size () == 2 ) {
193
+ swap (result[opID], result[opID-1 ]);
194
+ return concatenateVector (result);
195
+ } else if (result.size () >= 2 && vExp.length () == 1 && isOperator (vExp[0 ])) {
196
+ if (result.size () == 2 && opID == result.size ()-1 ){
197
+ swap (result[opID], result[opID-1 ]);
198
+ } else {
199
+ string merge;
200
+ merge = result[opID] + " " + result[opID - 1 ] + result[opID + 1 ];
201
+ result[opID - 1 ] = merge;
202
+ result.erase (result.begin () + opID, result.begin () + opID + 2 );
203
+ }
204
+ } else if (!vBracket->valid ) {
205
+ result[opID] = prefix (excludedBracket);
206
+ }
207
+ }
208
+ }
209
+ }
210
+ }
211
+ }
212
+ // Return result
213
+ return (error) ? " !" : concatenateVector (result);
214
+ }
215
+
216
+ int main (){
217
+ string infix = " K+L-M*N+(O^P)*W/U/V*T+Q" ;
218
+ cout << " Infix: " << infix << endl;
219
+
220
+ string result = prefix (infix);
221
+ if (result == " !" ){
222
+ cout << " INPUT: Invalid Expression!" << endl;
223
+ } else {
224
+ cout << " Prefix: " << result << endl;
225
+ }
226
+ }
0 commit comments