-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMax Stack.js
More file actions
89 lines (73 loc) · 1.65 KB
/
Max Stack.js
File metadata and controls
89 lines (73 loc) · 1.65 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
/*
Implement a LIFO stack that has:
- push(),
- pop(),
- max() functions,
Where max() returns the maximum value in the stack.
All of these functions should run in O(1) time.
*/
log = console.log;
class Stack {
constructor() {
this.stack = [];
this.currentIndex = 0;
this.maxStack = [];
this.maxCurrentIndex = 0;
}
push(el) {
this.stack[this.currentIndex++] = el;
if (
this.maxCurrentIndex === 0 ||
this.maxStack[this.maxCurrentIndex - 1] <= el
) {
this.maxStack[this.maxCurrentIndex++] = el;
}
}
pop() {
if (this.currentIndex - 1 >= 0) {
const popValue = this.stack[--this.currentIndex];
if (this.maxStack[this.maxCurrentIndex - 1] === popValue)
this.maxCurrentIndex--;
return popValue;
} else console.log("Stack Underflow!");
}
max() {
return this.maxStack[this.maxCurrentIndex - 1];
}
}
class Node {
constructor(value) {
this.value = value;
this.next = null;
this.oldMax = null;
}
}
class LinkedStack {
constructor() {
this.head = null;
this.localMax = null;
}
push(el) {
const node = new Node(el);
if (!this.head) this.head = node;
else {
node.next = this.head;
this.head = node;
}
if (!this.localMax || node.value > this.localMax) {
node.oldMax = this.localMax;
this.localMax = node.value;
}
}
pop() {
if (!this.head) throw new Error("Stack Underflow");
const popNode = this.head;
this.head = this.head.next;
if (!popNode.value) return this.localMax;
this.localMax = popNode.oldMax;
return popNode.value;
}
max() {
return this.localMax;
}
}