-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevaluate.cpp
49 lines (47 loc) · 1.47 KB
/
evaluate.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
* Dijkstra's Two-Stack Algorithm for Expression Evaluation
* Compilation: g++ -o evaluate evaluate.cpp -std=c++0x -g
* Dependencies:
* Execution: ./evaluate
* ( ( 2 + ( ( 3 * 4 ) * 5 ) ) + ( 6 * sqrt ( 4 ) ) )
* output:
* the result is: 74
*/
#include <stack>
#include <string>
#include <cmath>
#include <iostream>
#include <sstream>
using std::string;
int main(int argc, char* argv[]) {
std::stack<string> ops;
std::stack<double> vals;
string expr;
std::getline(std::cin, expr);
std::istringstream iss(expr);
while (iss.good()) {
string elm;
iss >> elm;
if (elm == "(") ;
else if (elm == "+") ops.push(elm);
else if (elm == "-") ops.push(elm);
else if (elm == "*") ops.push(elm);
else if (elm == "/") ops.push(elm);
else if (elm == "sqrt") ops.push(elm);
else if (elm == ")") {
// pop, evaluate and push result if value is ")"
string op = ops.top();
double v = vals.top();
ops.pop();
vals.pop();
if (op == "+") { v = vals.top() + v; vals.pop(); }
else if (op == "-") { v = vals.top() - v; vals.pop(); }
else if (op == "*") { v = vals.top() * v; vals.pop(); }
else if (op == "/") { v = vals.top() / v; vals.pop(); }
else if (op == "sqrt") v = std::sqrt(v);
vals.push(v);
} // Tlken is not operator or parenthesis, push double value
else vals.push(stod(elm));
}
std::cout << "the result is: " << vals.top() << std::endl;
}