-
Notifications
You must be signed in to change notification settings - Fork 0
/
calculator.h
82 lines (66 loc) · 1.34 KB
/
calculator.h
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#pragma once
#include "rpn.h"
#include "stack.h"
class calculator
{
private:
rpn _rpn;
stack<double> _stack;
table<double> valuetable;
public:
calculator(string str=""){
_rpn = rpn(str);
_stack = stack<double>(20);
valuetable = _rpn.Getvaluetable();
}
double Calculation() {
string * s = _rpn.Getrpn();
double Left = 0, Right = 0;
for (int i = 0; i < _rpn.Getsize(); i++) {
int l = valuetable.Search_number(s[i]);
if (l != -1) {
_stack.Push(valuetable.Search_value(s[i]));
}
else {
Right = _stack.Pop();
Left = _stack.Pop();
if (s[i] == "+")
_stack.Push(Left + Right);
else {
if (s[i] == "-")
_stack.Push(Left - Right);
else {
if (s[i] == "*")
_stack.Push(Left * Right);
else {
if (s[i] == "/")
if (Right != 0)
_stack.Push(Left / Right);
else
_stack.Push(0);
else if (s[i] == "^")
if (Left > 0)
_stack.Push(exp(Right*log(Left)));
else
_stack.Push(0);
}
}
}
}
}
return _stack.Pop();
}
table<double> Getvaluetable(){
return valuetable;
}
void Setvalue(string s, double d) {
valuetable.Add(s, d);
}
string* Getrpn() {
return _rpn.Getrpn();
}
int Getrpnsize() {
return _rpn.Getsize();
}
};
////////////////////////////////////////////////////////