CSE143 Stack/Queue Examples           handout #4
Queues should be constructed using the Queue interface and the
LinkedList implementation:
    Queue q = new LinkedList();
Stacks should be constructed using the Stack class (there is no interface):
    Stack s = new Stack();
For Stack, we are using the following operations:
    public void push(E value)  // push given value onto top of the stack
    public E pop()             // removes and returns the top of the stack
    public boolean isEmpty()   // returns whether or not stack is empty
    public int size()          // returns number of elements in the stack
For Queue, we are using the following operations:
    public void add(E value)  // inserts given value at the end of the queue
    public E remove()         // removes and returns the front of the queue
    public boolean isEmpty()  // returns whether or not queue is empty
    public int size()         // returns number of elements in the queue
Sample Program StackQueue.java
------------------------------
import java.util.*;
public class StackQueue {
    public static void main(String[] args) {
        Queue q = makeRandomQueue(10);
        System.out.println("initial queue = " + q);
        System.out.println("sum = " + sum(q));
        System.out.println("after sum queue = " + q);
        System.out.println();
        Stack s = new Stack();
        queueToStack(q, s);
        System.out.println("after queueToStack:");
        System.out.println("    queue = " + q);
        System.out.println("    stack = " + s);
        System.out.println();
        s = makeRandomStack(10);
        System.out.println("initial stack = " + s);
        System.out.println("sum = " + sum(s));
        System.out.println("after sum stack = " + s);
        System.out.println();
        stackToQueue(s, q);
        System.out.println("after stackToQueue:");
        System.out.println("    stack = " + s);
        System.out.println("    queue = " + q);
    }
    // pre : size >= 0
    // post: returns a queue of size random values from 0 to 99
    public static Queue makeRandomQueue(int size) {
        Random r = new Random();
        Queue q = new LinkedList();
        for (int i = 0; i < size; i++)
            q.add(r.nextInt(100));
        return q;
    }
    // pre : size >= 0
    // post: returns a stack of size random values from 0 to 99
    public static Stack makeRandomStack(int size) {
        Random r = new Random();
        Stack s = new Stack();
        for (int i = 0; i < size; i++)
            s.push(r.nextInt(100));
        return s;
    }
    // post: Values from q moved to s (added in queue order, front to back);
    //       q is empty
    public static void queueToStack(Queue q, Stack s) {
        while (!q.isEmpty()) {
            int n = q.remove();
            s.push(n);
        }
    }
    // post: Values from s moved to q (added in stack order, top to bottom);
    //       s is empty
    public static void stackToQueue(Stack s, Queue q) {
        while (!s.isEmpty()) {
            int n = s.pop();
            q.add(n);
        }
    }
    // post: returns the sum of the values in q
    public static int sum(Queue q) {
        int sum = 0;
        for (int i = 0; i < q.size(); i++) {
            int n = q.remove();
            sum = sum + n;
            q.add(n);
        }
        return sum;
    }
    // post: returns the sum of the values in s
    public static int sum(Stack s) {
        int sum = 0;
        Queue q = new LinkedList();
        while (!s.isEmpty()) {
            int n = s.pop();
            sum = sum + n;
            q.add(n);
        }
        queueToStack(q, s);
        stackToQueue(s, q);
        queueToStack(q, s);
        return sum;
    }
}