#include "T_Stack.h" #include #include typedef std::string String; int eval_infix(int left, char op, int right) { switch (op) { case '+': return left + right; case '-': return left - right; case '*': return left * right; case '/': return left / right; case '%': return left % right; } return 0; } bool isOperator(char c) { return !((int)c >= (int)'0' && (int)c <= (int)'9'); } // from char to digit int char_to_int(char c) { return ((int)c - (int)'0'); } int eval_postfix(const char expr[]) { Stack S; int left, right, i = 0; int rlt; while (expr[i] != '\0') { if (isOperator(expr[i])) { right = S.pop(); left = S.pop(); rlt=eval_infix(left, expr[i], right); S.push(rlt); } else { S.push(char_to_int(expr[i])); } i++; } return S.pop(); } // input: fully parenthesized infix expressions String infix_to_postfix(const char expr[]) { Stack S; int i = 0; String left, right, op, token; // (X+Y) ==> XY+ while (expr[i] != '\0') { token = expr[i]; if (token == ")") { right = S.pop(); op = S.pop(); left = S.pop(); S.push(left + right + op); // postfix } else { if (token != "(") { S.push(token); } } i++; } return S.pop(); } // input: fully parenthesized infix expressions String infix_to_prefix(const char expr[]) { Stack S; int i = 0; String left, right, op, token; // (X+Y) ==> +XY while (expr[i] != '\0') { token = expr[i]; if (token == ")") { right = S.pop(); op = S.pop(); left = S.pop(); S.push(op + left + right); // prefix } else { if (token != "(") { S.push(token); } } i++; } return S.pop(); } int main() { std::cout << infix_to_postfix("((((2*3)/2)-1)+(3*4))") << std::endl; std::cout << infix_to_prefix("((((2*3)/2)-1)+(3*4))") << std::endl; std::cout << eval_postfix("23*2/1-34*+") << std::endl; }