-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathInfix_to_Postfix.cpp
124 lines (105 loc) Β· 5.05 KB
/
Infix_to_Postfix.cpp
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
119
120
121
122
123
124
#include <iostream>
#include <stack>
using namespace std;
/*βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ*/
bool IsOperator(char);
bool IsOperand(char);
int precedence(char);
bool eqlOrhigher(char, char);
string convert(string);
/*βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ*/
int main(){
string infix_expression, postfix_expression;
int ch;
do {
cout << "Enter an infix expression : " << endl;
getline (cin, infix_expression);
postfix_expression = convert(infix_expression);
cout << "\nYour Infix expression is : " << infix_expression;
cout << "\nPostfix expression is : " << postfix_expression;
cout << "\n\nDo you want to enter another infix expression (1/0) ? ";
cin >> ch;
} while(ch == 1);
return 0;
}
/*βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ*/
// define the IsOperator() function to validate whether any symbol is operator. If the symbol is operator, it returns true, otherwise false.
bool IsOperator(char c){
if(c == '+' || c == '-' || c == '*' || c == '/' || c == '^' )
return true;
return false;
}
/*βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ*/
// IsOperand() function is used to validate whether the character is operand.
bool IsOperand(char c){
// Define the character in between A to Z. If not, it returns False.
if( c >= 'A' && c <= 'Z')
return true;
// Define the character in between a to z. If not, it returns False.
if (c >= 'a' && c <= 'z')
return true;
// Define the character in between 0 to 9. If not, it returns False.
if(c >= '0' && c <= '9')
return true;
return false;
}
/*βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ*/
// precedence() function is used to define the precedence to the operator.
int precedence(char op){
if(op == '+' || op == '-') // it defines the lowest precedence
return 1;
if (op == '*' || op == '/')
return 2;
if(op == '^') // exponent operator has the highest precedence
return 3;
return 0;
}
/*βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ*/
// eqlOrhigher() function is used to check the higher or equal precedence of the two operators in infix expression.
bool eqlOrhigher (char op1, char op2){
int p1 = precedence(op1);
int p2 = precedence(op2);
if (p1 == p2){
if (op1 == '^' )
return false;
return true;
}
return (p1 > p2 ? true : false);
}
/*βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ*/
// string convert() function is used to convert the infix expression to the postfix expression of the Stack
string convert(string infix){
stack <char> S;
string postfix = "";
char ch;
S.push('(');
infix += ')';
for (int i = 0; i < infix.length(); i++){
ch = infix[i];
if(ch == ' ' && !IsOperator(infix[i+1])){
postfix += ' ';
continue;
}
if(ch == '(')
S.push(ch);
else if(IsOperand(ch)){
postfix += ch;
}
else if(IsOperator(ch)){
while(!S.empty() && eqlOrhigher(S.top(), ch)){
postfix += S.top();
S.pop();
}
S.push(ch);
}
else if(ch == ')'){
while(!S.empty() && S.top() != '('){
postfix += S.top();
S.pop();
}
S.pop();
}
}
return postfix;
}
/*βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ*/