Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- // from this site: https://www.geeksforgeeks.org/expression-evaluation/
- int precedence(char op) {
- if (op == '+' || op == '-') {
- return 1;
- }
- if (op == '*' || op == '/') {
- return 2;
- }
- return 0;
- }
- double apply_op(double a, double b, char op) {
- switch (op) {
- case '+': {
- return a + b;
- break;
- }
- case '-': {
- return a - b;
- break;
- }
- case '*': {
- return a * b;
- break;
- }
- case '/': {
- return a / b;
- break;
- }
- }
- }
- int evaluate(string tokens) {
- stack<double> values;
- stack<char> ops;
- for (int i = 0; i < (int) tokens.size(); i++) {
- if (tokens[i] == ' ') {
- continue;
- } else if (tokens[i] == '(') {
- ops.push(tokens[i]);
- } else if (isdigit(tokens[i])) {
- double val = 0;
- while (i < (int) tokens.size() && isdigit(tokens[i])) {
- val = (val * 10) + (tokens[i] - '0');
- i++;
- }
- values.push(val);
- i--;
- } else if (tokens[i] == ')') {
- while (!ops.empty() && ops.top() != '(') {
- double val2 = values.top();
- values.pop();
- double val1 = values.top();
- values.pop();
- char op = ops.top();
- ops.pop();
- values.push(apply_op(val1, val2, op));
- }
- if (!ops.empty()) {
- ops.pop();
- }
- } else {
- while (!ops.empty() && precedence(ops.top()) >= precedence(tokens[i])) {
- double val2 = values.top();
- values.pop();
- double val1 = values.top();
- values.pop();
- char op = ops.top();
- ops.pop();
- values.push(apply_op(val1, val2, op));
- }
- ops.push(tokens[i]);
- }
- }
- while (!ops.empty()) {
- double val2 = values.top();
- values.pop();
- double val1 = values.top();
- values.pop();
- char op = ops.top();
- ops.pop();
- values.push(apply_op(val1, val2, op));
- }
- return values.top();
- }
- int main() {
- cout << evaluate("((9+(5-3)*4)/2)*8") << "\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement