-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathintoPostFix.cpp
137 lines (119 loc) · 3.83 KB
/
intoPostFix.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
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <iostream>
#include <string>
using namespace std;
#define maxExpressionSize 100
int push(char stack[], int TOS, char ch) {
if (TOS + 1 >= maxExpressionSize) {
cout << "Overflow" << endl;
return TOS;
}
TOS++;
stack[TOS] = ch;
return TOS;
}
int pop(char stack[], int TOS) {
if (TOS < 0) {
cout << "Underflow" << endl;
return TOS;
}
TOS--;
return TOS;
}
char peep(char stack[], int TOS) {
return stack[TOS];
}
int precedence(char ch) {
if (ch == '+' || ch == '-') return 1;
if (ch == '*' || ch == '/') return 2;
return -1; // For '(' or invalid characters
}
int isOperand(char ch) {
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9');
}
int main() {
string infixExpressionInput;
cout << "Enter the infix expression: ";
cin >> infixExpressionInput;
int maxSize = infixExpressionInput.length();
char outputExpression[maxSize + 1]; // Added 1 for null termination
char stack[maxSize];
int TOS = -1;
int oTOS = -1;
// Traverse the input expression
for (int i = 0; i < maxSize; i++) {
char ch = infixExpressionInput[i];
// If the character is an operand, add it to output
if (isOperand(ch)) {
oTOS = push(outputExpression, oTOS, ch);
}
// If '(', push to stack
else if (ch == '(') {
TOS = push(stack, TOS, ch);
}
// If ')', pop until '(' is found
else if (ch == ')') {
while (TOS >= 0 && stack[TOS] != '(') {
oTOS = push(outputExpression, oTOS, stack[TOS]);
TOS = pop(stack, TOS);
}
TOS = pop(stack, TOS); // Pop the '('
}
// Operator encountered
else {
int currentPrecedence = precedence(ch);
while (TOS >= 0 && precedence(stack[TOS]) >= currentPrecedence) {
oTOS = push(outputExpression, oTOS, stack[TOS]);
TOS = pop(stack, TOS);
}
TOS = push(stack, TOS, ch);
}
}
// Pop remaining operators from the stack
while (TOS >= 0) {
oTOS = push(outputExpression, oTOS, stack[TOS]);
TOS = pop(stack, TOS);
}
// Null terminate the output expression for printing
outputExpression[oTOS + 1] = '\0';
// Print the postfix expression
cout << "Postfix expression: ";
for (int i = 0; i <= oTOS; i++) {
cout << outputExpression[i];
}
cout << endl;
// Evaluate the postfix expression
char postEvaluation[maxExpressionSize];
int postTOS = -1;
for (int i = 0; i <= oTOS; i++) {
char c = outputExpression[i];
if (isOperand(c)) {
postTOS = push(postEvaluation, postTOS, c); // Push as char
} else {
int operand2 = peep(postEvaluation, postTOS) - '0'; // Convert char to int
postTOS = pop(postEvaluation, postTOS);
int operand1 = peep(postEvaluation, postTOS) - '0'; // Convert char to int
postTOS = pop(postEvaluation, postTOS);
int result;
switch (c) {
case '+':
result = operand1 + operand2;
break;
case '-':
result = operand1 - operand2;
break;
case '*':
result = operand1 * operand2;
break;
case '/':
result = operand1 / operand2;
break;
default:
result = 0; // Handle default case
}
postTOS = push(postEvaluation, postTOS, result + '0'); // Convert back to char
}
}
// The result will be on the top of the postEvaluation stack
cout << "Result of postfix evaluation: " << (peep(postEvaluation, postTOS) - '0') << endl;
return 0;
}