public class MidStack<T> {
static class Node<T>{
T val;
Node<T> next = null;
Node<T> pre = null;
public Node(T val){
this.val = val;
}
}
private int size = 0;
private Node<T> head = null;
private Node<T> tail = null;
private Node<T> mid = null;
public T pop() {
if (tail == null) {
return null;
}
Node<T> temp = tail;
if (tail == head) {
tail = null;
head = null;
mid = null;
} else {
tail.pre.next = null;
if (size % 2 != 0) {
mid = mid.pre;
}
tail = tail.pre;
}
size--;
return temp.val;
}
public void push(T val) {
Node<T> newNode = new Node<>(val);
if (head == null) {
head = newNode;
tail = newNode;
mid = newNode;
} else {
tail.next = newNode;
newNode.pre = tail;
tail = newNode;
if (size % 2 == 0) {
mid = mid.next;
}
}
size++;
}
public T peekMid() {
if (mid == null) {
return null;
}
return mid.val;
}
public T popMid() {
if(size == 0) {
return null;
}
if (size == 2) {
T temp = mid.val;
head = tail;
mid = tail;
size--;
return temp;
}
if (size == 1) {
T temp = mid.val;
mid = head = tail = null;
size--;
return temp;
}
mid.pre.next = mid.next;
mid.next.pre = mid.pre;
if (size % 2 == 0) {
mid = mid.next;
} else {
mid = mid.pre;
}
size--;
return mid.val;
}
public String toString() {
if (head == null) {
return "";
}
Node<T> cur = head;
StringBuilder sb = new StringBuilder();
while (cur != null) {
sb.append(cur.val).append(',');
cur = cur.next;
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
public static void main(String[] args) {
MidStack<Integer> ms = new MidStack<>();
ms.push(1);
ms.push(2);
ms.push(3);
ms.pop();
ms.pop();
System.out.println("stack: " + ms);
System.out.println("mid: " + ms.peekMid());
ms.popMid();
System.out.println("stack: " + ms);
System.out.println("mid: " + ms.peekMid());
}
}