import java.util.Scanner; interface Stack { public Object pop(); public void push(Object x); public boolean empty(); public int size(); } class ArrayStack implements Stack { private Object data[]; private int top; public ArrayStack() { data = new Object[1000]; top = -1; } public int size() { return top + 1; } public boolean empty() { return top == -1; } public void push(Object x) { if (size() == 1000) throw new RuntimeException("Stack Full"); data[++top] = x; } public Object pop() { if (empty()) throw new RuntimeException("Stack Empty"); return data[top--]; } // methods for testing purposes public String toString() { String ans = "Array Stack: "; for (int i = top; i>= 0; i--) ans += ( data[i] + " -> "); return ans; } public static void main(String args[]) { Stack s = new ArrayStack(); testStack(s); } public static void testStack(Stack s) { boolean done = false; while (!done) { try { Scanner sc = new Scanner(System.in); System.out.print( s + " "); System.out.println("\ncmds are + - Q: >>"); String cmd = sc.next(); String entry = null; char command = cmd.charAt(0); if (command == '+') entry = sc.next(); switch (cmd.charAt(0)) { case 'Q': done = true; break; case '+': s.push(entry); break; case '-': s.pop(); break; } } catch (Exception e) { System.out.println("Error " + e.toString()); } } } } class ListAdapterStack implements Stack { private LinkedList l; public ListAdapterStack() { l = new LinkedList(); } public int size() { return l.size(); } public boolean empty() { return l.isEmpty(); } public void push(Object d) { l.addHead(d); } public Object pop() { return l.removeHead(); } public String toString() { return l.toString(); } public static void main(String args[]) { Stack s = new ListAdapterStack(); ArrayStack.testStack(s); } } class LinkedStack implements Stack { private Node top; private int size; public LinkedStack() { top = null; size = 0; } public int size() { return size; } public boolean empty() { return size == 0; } public Object pop() { if (empty()) throw new RuntimeException(); Object answer = top.getData(); top = top.getNext(); size--; return answer; } public void push(Object x) { Node newtop = new Node(x, top); top = newtop; size++; } public String toString() { String ans = "Linked Stack: "; Node n = top; while (n != null) { ans += ( n.getData() + " -> "); n = n.getNext(); } return ans; } public static void main(String args[]) { Stack s = new LinkedStack(); ArrayStack.testStack(s); } } class Node { private Object data; private Node next; public Node(Object x, Node n) { data = x; next = n; } public Object getData() { return data; } public Node getNext() { return next; } public void setData(Object x) { data = x; } public void setNext(Node n) { next = n; } }