This repository was archived by the owner on Mar 18, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrpnalgorithm.cpp
More file actions
101 lines (88 loc) · 2.02 KB
/
Copy pathrpnalgorithm.cpp
File metadata and controls
101 lines (88 loc) · 2.02 KB
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "rpnalgorithm.h"
RpnAlgorithm::RpnAlgorithm()
{
}
void RpnAlgorithm::processing(QString item)
{
if(item == ")")
{
while(stack.top() != "(")
output.append(stack.pop());
stack.pop();
}
else if(isNumber(item))
{
output.append(item);
}
else if(item == "(")
{
stack.push(item);
}
else
{
if(stack.empty())
{
stack.push(item);
}
else if(operationPriority(item) > operationPriority(stack.top()))
{
stack.push(item);
}
else
{
while(operationPriority(item) >= operationPriority(stack.top()))
output.append(stack.pop());
stack.push(item);
}
}
}
void RpnAlgorithm::buildOutputItemSequence()
{
foreach(QString item, items)
{
processing(item);
}
while(!stack.empty())
output.append(stack.pop());
}
double RpnAlgorithm::calculate()
{
if(items.size() == 0)
return 0.0;
if(items.size() == 1)
return items[0].toDouble();
buildOutputItemSequence();
while(!output.empty())
{
if(isNumber(output.front()))
{
stack.push(output.front());
}
else if(isUnaryOperations(output.first()))
{
double result = executeAction(stack.pop(), output.first());
stack.push(QString::number(result));
}
else
{
double result = executeAction(stack.pop(), output.first(), stack.pop());
stack.push(QString::number(result));
}
output.removeFirst();
}
return stack.pop().toDouble();
}
int RpnAlgorithm::operationPriority(QString item)
{
if(item == "(")
return 0;
else if(item == ")")
return 1;
else if(item == "+" || item == "-")
return 2;
else if(item == "*" || item == "/")
return 3;
else if("^")
return 4;
throw std::invalid_argument("Операция не существует");
}