-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
146 lines (127 loc) · 3.21 KB
/
Copy pathscript.js
File metadata and controls
146 lines (127 loc) · 3.21 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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Class declaration
class Stack {
constructor() {
this.items = [];
}
isEmpty() {
return this.items.length == 0;
}
push(element) {
this.items.push(element);
}
pop() {
if (!this.isEmpty()) {
return this.items.pop();
}
}
peek() {
if (!this.isEmpty()) {
return this.items[this.items.length - 1];
}
}
}
// Variable declaration
const result = document.querySelector('#result span');
const nums = Array.from(document.getElementsByClassName('num'));
const ops = Array.from(document.getElementsByClassName('op'));
const specials = Array.from(document.getElementsByClassName('special'));
let display = '';
let numStack = new Stack();
let opStack = new Stack();
// Function Declaration
function addToDisplay(item) {
result.textContent += item;
}
function updateDisplay(item) {
result.textContent = item;
}
function emptyDisplay() {
result.textContent = '';
}
function delDisplay() {
let currentDisplay = result.textContent;
updateDisplay(currentDisplay.slice(0, currentDisplay.length - 1));
}
function doSpecial(item) {
if (item == '=') {
evaluate();
} else if (item == 'AC') {
emptyDisplay();
} else if (item =='Del') {
delDisplay();
}
}
function checkPriority(op) {
if (op == '*' || op == '/') {
return 2;
} else {
return 1;
}
}
function doOperation(op, prev, next) {
if (op == '+') {
return prev + next;
} else if (op == '-') {
return prev - next;
} else if (op == '*') {
return prev * next;
} else {
return prev / next;
}
}
function evaluate() {
let i = 0;
let highPrio = false;
let startIdx, tempNum, prevNum, op, period;
display = result.textContent;
while (i < display.length) {
if (!isNaN(display[i])) {
period = false;
startIdx = i++;
while (!isNaN(display[i]) || (display[i] == '.' && !period)) {
i++;
if (display[i] == '.') {
period = true;
}
}
tempNum = parseFloat(display.slice(startIdx, i));
if (highPrio) {
prevNum = numStack.pop();
tempNum = doOperation(opStack.pop(), prevNum, tempNum);
highPrio = false;
}
numStack.push(tempNum);
i--;
} else {
if (checkPriority(display[i]) == 2) {
highPrio = true;
}
opStack.push(display[i]);
}
i++;
}
while (!opStack.isEmpty()) {
tempNum = numStack.pop();
prevNum = numStack.pop();
op = opStack.pop();
numStack.push(doOperation(op, prevNum, tempNum));
}
updateDisplay
(numStack.pop());
}
// Event Handler
for (let num of nums) {
num.addEventListener('click', function() {
addToDisplay(this.textContent);
});
}
for (let op of ops) {
op.addEventListener('click', function() {
addToDisplay(this.textContent);
})
}
for (let special of specials) {
special.addEventListener('click', function() {
doSpecial(special.textContent);
})
}