//
// Created by Fredrick Park on 3/26/17.
//
// simple code to reverse a queue and output the reverse


#include <iostream>
#include "queue.h"
#include "stack.h"
using namespace std;

const int SENTINEL = 0; // global variable

/* main program */
// reverse list of entered numbers using the queue class

void reverseQueue(Queue<int> & queue);
void outputQueue(Queue<int> queue); // <--- why not call by ref?

int main() {
    cout << "This program uses a function to reverse a Queue of integers and output the result." << endl;
    cout << "It uses other data structures to do so." << endl;
    cout << "Use " << SENTINEL << " to signal the end." << endl;
    int val;
    Queue<int> queue; //
    while (true) {
        cout << "? ";
        cin >> val;
        if (val == SENTINEL) break;
        queue.enqueue(val);

    }
    // output queue
    cout << "your queue:" << endl;
    outputQueue(queue);
    cout << endl;

    // reverse queue
    reverseQueue(queue);
    cout << "your queue reversed:" << endl;
    // output reversed queue
    outputQueue(queue);
    return 0;
}

// function to reverse queue
void reverseQueue(Queue<int> & queue){
    int qSize = queue.size();
    Stack<int> stack;
    for (int i = 0; i < qSize; i++){
        stack.push(queue.dequeue());
    }
    for (int i = 0; i < qSize; i++){
        queue.enqueue(stack.pop());
    }
}

// output queue
void outputQueue(Queue<int> queue){
    int qSize = queue.size();
    for (int i = 0; i < qSize; i++) {
        cout << " " << queue.dequeue() << " ";
    }
    cout << endl;

}

