-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGetMiddleStack.java
More file actions
94 lines (86 loc) · 2.03 KB
/
GetMiddleStack.java
File metadata and controls
94 lines (86 loc) · 2.03 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
package gfg.ds.stack;
import gfg.ds.linked_list.DoublyLinkedList;
import gfg.ds.stack.adt.Stack;
/**
* Deleting an element from middle is not O(1) for array. Also, we may need to move middle pointer
* up when we push an element and move down when we pop(). In singly linked list, moving middle
* pointer in both directions is not possible.
*
* @noinspection WeakerAccess
*/
public class GetMiddleStack implements Stack {
private DoublyLinkedList.DNode top;
private DoublyLinkedList.DNode mid;
private int size;
@Override
public void push(int data) {
DoublyLinkedList.DNode node = new DoublyLinkedList.DNode(data);
// new node is always added to the head of the stack.
node.prev = null;
node.next = top;
if (node.next != null) {
node.next.prev = node;
}
top = node;
size++;
if (size == 1) {
mid = top;
} else if (size % 2 == 1) {
// If now total elements are odd then move up.
mid = mid.prev;
}
}
@Override
public int pop() {
assert !isEmpty() : "Stack is empty";
int val = top.data;
top = top.next;
if (top != null) {
top.prev = null;
}
size--;
if (size == 0) {
mid = top = null;
} else if (size % 2 == 0) {
// If now total elements are even then move down.
mid = mid.next;
}
return val;
}
@Override
public boolean isEmpty() {
return top == null;
}
@Override
public int peek() {
assert !isEmpty() : "Stack is empty";
return top.data;
}
public int peekMiddle() {
assert !isEmpty() : "Stack is empty";
return mid.data;
}
public int popMiddle() {
assert !isEmpty() : "Stack is empty";
int val = mid.data;
DoublyLinkedList.DNode temp;
if (size % 2 == 1) {
temp = mid.next;
} else {
temp = mid.prev;
}
if (mid.prev != null) {
mid.prev.next = mid.next;
}
if (mid.next != null) {
mid.next.prev = mid.prev;
}
size--;
if (size == 0) {
mid = top = null;
} else {
mid = temp;
}
return val;
}
}