-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path23_8_infix_to_prefix.cpp
100 lines (91 loc) · 2.64 KB
/
23_8_infix_to_prefix.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
#include <iostream>
#include <stack>
#include <algorithm>
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 infixToPrefix(string s)
{
reverse(s.begin(),s.end());
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];
}
// We assumed ( as ), instead of converting it.
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();
}
}
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();
}
reverse(res.begin(),res.end());
return res;
}
int main()
{
cout << infixToPrefix("(a-b/c)*(a/k-l)");
return 0;
}
/*
1. Reverse the String
2. Convert ( to ), and viceversa.
3.
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.
Pop 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.)
4. Reverse the string again.
*/