#include #include #include using namespace std; template class stack { private: vector st; T sentinel; public: stack() { sentinel = T(); } bool empty() { return st.empty(); } void push(T info) { st.push_back(info); } T& top() { if (!st.empty()) { return st.back(); } return sentinel; } T pop() { T ret = top(); if (!st.empty()) st.pop_back(); return ret; } }; //determine associativity of operator, returns true if left, false if right bool leftAssociate(char c) { switch (c) { case '^': return false; case '*': return true; case '/': return true; case '%': return true; case '+': return true; case '-': return true; default: break; } return false; } //determins precedence level of operator int precedence(char c) { switch (c) { case '^': return 7; case '*': return 5; case '/': return 5; case '%': return 5; case '+': return 3; case '-': return 3; default: break; } return 0; } //converts infix expression string to postfix expression string string shuntingYard(string expr) { stack ops; string output; for (char c : expr) { if (c == '(') { ops.push(c); } else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '%') { if (precedence(c) < precedence(ops.top()) || (precedence(c) == precedence(ops.top()) && leftAssociate(c))) { output.push_back(' '); output.push_back(ops.pop()); output.push_back(' '); ops.push(c); } else { ops.push(c); output.push_back(' '); } } else if (c == ')') { while (!ops.empty()) { if (ops.top() != '(') { output.push_back(ops.pop()); } else { ops.pop(); break; } } } else { output.push_back(c); } } while (!ops.empty()) if (ops.top() != '(') output.push_back(ops.pop()); else ops.pop(); cout<<"Postfix: "< lex(string pfExpr) { vector tokens; for (int i = 0; i < pfExpr.size(); i++) { char c = pfExpr[i]; if (isdigit(c)) { string num; do { num.push_back(c); c = pfExpr[++i]; } while (i < pfExpr.size() && isdigit(c)); tokens.push_back(Token(stof(num))); i--; continue; } else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '%') { tokens.push_back(Token(c)); } } return tokens; } //structure used for nodes of expression tree struct node { Token token; node* left; node* right; node(Token tok) : token(tok), left(nullptr), right(nullptr) { } }; //builds expression tree from vector of tokens node* buildTree(vector tokens) { cout<<"Building Expression Tree: "< sf; for (int i = 0; i < tokens.size(); i++) { Token c = tokens[i]; if (c.type == 1) { node* x = new node(c); x->right = sf.pop(); x->left = sf.pop(); sf.push(x); cout<<"Push Operator Node: "<token.op<token.type == 0) { for (int i = 0; i < recd; i++) cout<<" "; cout<<"Value Node: "<token.num<token.num; } if (x->token.type == 1) { for (int i = 0; i < recd; i++) cout<<" "; cout<<"Operator Node: "<token.op<left); double rhs = eval(x->right); for (int i = 0; i < recd; i++) cout<<" "; cout<token.op<<" "<token.op) { case '^': return pow(lhs, rhs); case '*': return lhs*rhs; case '/': if (rhs == 0) { cout<<"Error: divide by zero."<