Skip to content

Commit 87dceda

Browse files
committed
Added trees
1 parent 95d6c3b commit 87dceda

File tree

48 files changed

+7523
-24
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+7523
-24
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
#include <iostream>
2+
#include <algorithm>
3+
#include <stack>
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+
bool isOperand(char data){
27+
return (data >= 'a' && data <= 'z') || (data >= 'A' && data <= 'Z');
28+
}
29+
30+
bool isOperator(char data){
31+
return (data == '+' || data == '-' || data == '*' || data == '/' || data == '^');
32+
}
33+
34+
bool isBracket(char data){
35+
return (data == '(' || data == ')');
36+
}
37+
38+
int priority(char data){
39+
if(data == '^'){
40+
return 3;
41+
} else if(data == '*' || data == '/'){
42+
return 2;
43+
} else if(data == '+' || data == '-'){
44+
return 1;
45+
} else {
46+
return 0;
47+
}
48+
}
49+
50+
string postfix(string infix){
51+
stack<char> stack;
52+
string result, number;
53+
char data;
54+
55+
Expression *exp = new Expression;
56+
exp = expression(infix);
57+
bool error = (!exp->valid) ? true : false;
58+
59+
// ----- Start Scanning -----/ //
60+
if(!error){
61+
for(int i = 0; i < infix.length(); i++){
62+
data = infix[i];
63+
if(isOperand(data) && exp->type == "alphabetic"){
64+
result += string(1, data) + " ";
65+
} else if(isdigit(data) && exp->type == "numeric") {
66+
number += data;
67+
if(i == infix.length()-1) result += number + " ";
68+
} else if(isBracket(data)){
69+
if(data == '('){
70+
stack.push(data);
71+
} else if(data == ')'){
72+
while(!stack.empty() && stack.top() != '(') {
73+
result += string(1, stack.top()) + " ";
74+
stack.pop();
75+
if(stack.empty()){
76+
error = true;
77+
break;
78+
}
79+
}
80+
if(!stack.empty() && stack.top() == '(') stack.pop();
81+
}
82+
} else if(isOperator(data) || data == ' '){
83+
if(number.length() > 0) result += number + " "; number = "";
84+
85+
if(isOperator(data)){
86+
if(stack.empty() || (!stack.empty() && priority(data) > priority(stack.top()))){
87+
stack.push(data);
88+
} else if(priority(data) < priority(stack.top())){
89+
while(!stack.empty() && priority(data) <= priority(stack.top())){
90+
result += string(1, stack.top()) + " ";
91+
stack.pop();
92+
}
93+
stack.push(data);
94+
} else if(priority(data) == priority(stack.top())){
95+
if(data != '^'){
96+
while(!stack.empty() && priority(data) == priority(stack.top())){
97+
result += string(1, stack.top()) + " ";
98+
stack.pop();
99+
}
100+
}
101+
stack.push(data);
102+
}
103+
}
104+
}
105+
}
106+
}
107+
108+
if(!error){
109+
while(!stack.empty()){
110+
result += stack.top();
111+
stack.pop();
112+
if(!stack.empty()) result += " ";
113+
}
114+
} else {
115+
result = "!";
116+
}
117+
return result;
118+
}
119+
120+
int main(){
121+
string infix = "K+L-M*N+(O^P)*W/U/V*T+Q";
122+
cout << "Infix: " << infix << endl;
123+
124+
string result = postfix(infix);
125+
if(result == "!"){
126+
cout << "INPUT: Invalid Expression!" << endl;
127+
} else {
128+
cout << "Postfix: " << result << endl;
129+
}
130+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
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

Comments
 (0)