#C++ need help
1 messages · Page 1 of 1 (latest)
this is what i have, and it does not work
#include <iostream>
#include <stack>
#include <cmath>
#include <sstream>
#include <vector>
using namespace std;
class Node {
public:
char type;
double value;
char op;
Node* left;
Node* right;
Node(char t, double v = 0, char o = '\0') : type(t), value(v), op(o), left(nullptr), right(nullptr) {}
};
bool isOperator(char c) {
return c == '+' || c == '-' || c == '' || c == '/';
}
class ExpressionTree {
public:
Node root;
ExpressionTree() : root(nullptr) {}
double evaluate(Node* node) {
if (node->type == 'V') return node->value;
double left = evaluate(node->left);
double right = evaluate(node->right);
switch (node->op) {
case '+': return left + right;
case '-': return left - right;
case '': return left * right;
case '/': return left / right;
default: return 0;
}
}
void infixTraversal(Node node) {
if (node != nullptr) {
infixTraversal(node->left);
cout << (node->type == 'V' ? node->value : node->op) << " ";
infixTraversal(node->right);
}
}
void prefixTraversal(Node* node) {
if (node != nullptr) {
cout << (node->type == 'V' ? node->value : node->op) << " ";
prefixTraversal(node->left);
prefixTraversal(node->right);
}
}
void postfixTraversal(Node* node) {
if (node != nullptr) {
postfixTraversal(node->left);
postfixTraversal(node->right);
cout << (node->type == 'V' ? node->value : node->op) << " ";
}
}
};
bool buildExpressionTree(string expression, ExpressionTree& tree) {
stack<Node*> nodes;
istringstream iss(expression);
string token;
while (iss >> token) {
if (token == "(" || isOperator(token[0])) {
nodes.push(new Node('O', 0, token[0]));
} else if (token == ")") {
if (nodes.size() < 3) {
return false; // Invalid number of operands
}
Node* op = nodes.top(); nodes.pop();
op->right = nodes.top(); nodes.pop();
op->left = nodes.top(); nodes.pop();
nodes.push(op);
} else {
double value;
try { value = stod(token); }
catch (invalid_argument& e) { return false; }
nodes.push(new Node('V', value));
}
}
if (nodes.size() != 1) return false;
tree.root = nodes.top();
return true;
}
bool checkErrors(string expression) {
stack<char> parentheses;
for (char c : expression) {
if (c == ' ') {
continue; // Skip spaces
} else if (c == '(') {
parentheses.push(c);
} else if (c == ')') {
if (parentheses.empty() || parentheses.top() != '(') {
return true; // Unmatched closing parenthesis or invalid placement
}
parentheses.pop();
} else if (isOperator(c)) {
if (parentheses.empty()) {
return true; // Operator without preceding operand
}
}
}
return !parentheses.empty(); // Unmatched opening parenthesis
}
int main() {
vector<string> expressions = {
"(10.24 + 5.4 * 2.5) / 6.7 + (12.5 * 20.67 + 10) * 25",
"(10.24 + 5.4 * 2.5) / 6.7 + (12.5 * 20.67 + 10) * 25)",
"(10.24 + 5.4 * 2.5) / 6.7 + (12.5 * 20.67 + ) * 25"
};