question:
Two stacks with a deque. Implement two stacks with a single deque so that each operation takes a constant number of deque operations(see EXERCISE 1.3.33).
answer:
import edu.princeton.cs.algs4.*; public class StackDeque<Item> { private class Stack<Item> { private class Node { Item item; Node next; } private Node top; private int N; public Stack() { top = null; N = 0; } public boolean isEmpty() { return N == 0; } public int size() { return N; } public void push(Item item) { Node node = new Node(); node.item = item; node.next = null; if(N == 0) { top = node; N++; return; } N++; node.next = top; top = node; } public Item pop() { if(N == 0) { return null; } N--; Item item = top.item; top = top.next; return item; } } //从这开始看,之前的是栈类 private Stack<Item> left; private Stack<Item> right; private int stequeN; public StackDeque() { left = new Stack<Item>(); right = new Stack<Item>(); stequeN = 0; } public boolean isEmpty() { return stequeN == 0; } public int size() { stequeN = left.size() + right.size(); return stequeN; } public void pushLeft(Item item) { left.push(item); stequeN = left.size() + right.size(); } public void pushRight(Item item) { right.push(item); stequeN = left.size() + right.size();; } public Item popLeft() { Item item = left.pop(); stequeN = left.size() + right.size(); return item; } public Item popRight() { Item item = right.pop(); stequeN = left.size() + right.size(); return item; } public static void main(String[] args) { StackDeque<String> deque = new StackDeque<String>(); deque.pushLeft("w"); deque.pushRight("j"); deque.pushRight("c"); StdOut.println(deque.size()); StdOut.print(deque.popLeft() + "\t"); StdOut.print(deque.popLeft() + "\t"); StdOut.print(deque.popRight() + "\t"); StdOut.println("\n" + deque.size()); } }