-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path23_7_infix_to_postfix.cpp
90 lines (84 loc) · 2.61 KB
/
23_7_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
#include <iostream>
#include <stack>
using namespace std;
int prec(char c)
{
if (c == '^')
{
return 3;
}
else if (c == '*' || c == '/')
{
return 2;
}
else if (c == '+' || c == '-')
{
return 1;
}
else
{
return -1;
}
}
string infixToPostfix(string s)
{
stack<char> st;
string res;
for (int i = 0; i < s.length(); i++)
{
if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))
{
res += s[i];
}
else if (s[i] == '(')
{
st.push(s[i]);
}
else if (s[i] == ')')
{
while (!st.empty() && st.top() != '(')
{
res += st.top();
st.pop();
}
if (!st.empty())
{
st.pop(); // This pop() is for removing '(' while checking the stack is empty of not
}
}
else
{
while (!st.empty() && prec(st.top()) >= prec(s[i]))
{
res += st.top();
st.pop();
}
st.push(s[i]);
}
}
while (!st.empty())
{
res += st.top();
st.pop();
}
return res;
}
int main()
{
cout << infixToPostfix("(a-b/c)*(a/k-l)");
return 0;
}
/*
If operand
print
If (
push to the stack
If )
pop from the stack and print until ( is found
If ^
‘^’ operator is right associative and other operators like ‘+’,’-‘,’*’ and ‘/’ are left-associative. Check especially for a condition when both, operator at the top of the stack and the scanned operator are ‘^’. In this condition, the precedence of the scanned operator is higher due to its right associativity. So it will be pushed into the operator stack. In all the other cases when the top of the operator stack is the same as the scanned operator, then pop the operator from the stack because of left associativity due to which the scanned operator has less precedence.
If operator
If the precedence and associativity of the scanned operator are greater than the operator in the stack (or the stack is empty or the stack contains a '('),then push it.
If the precedence and associativity of the scanned operator are less than the operator in the stack then,
Pop and print all the operators from the stack which are greater than or equal to in precedence than that of the scanned operator. After doing that Push the scanned operator to the stack. (If you encounter parenthesis while popping then stop there and push the scanned operator in the stack.)
*/