queue

by not important

HTML

<script src="http://searls.github.io/jasmine-all/jasmine-all-min.js"></script>

JavaScript

var Stack = function () {
    this.list = [];
};

Stack.prototype.push = function (item) {
    this.list.push(item);
};

Stack.prototype.pop = function () {
    return this.list.pop();
};

Stack.prototype.isEmpty = function () {
    return !this.list.length;
};

var Queue = function () {
    this.inStack = new Stack();
    this.outStack = new Stack();
};

Queue.prototype.enqueue = function (item) {
    this.inStack.push(item);
};

Queue.prototype.dequeue = function () {
    if(!this.outStack.isEmpty()) {
        return this.outStack.pop();
    } else {
        var item;
        while(!this.inStack.isEmpty()) {
            item = this.inStack.pop();

            if(this.inStack.isEmpty()) {
                return item;
            } else {
                this.outStack.push(item);
            };
        }
    }
};

describe('Queue', function () {
    var queue;

    beforeEach(function () {
        queue = new Queue();
    });

    it('can enqueue and dequeue', function () {
        queue.enqueue('a');
        expect(queue.dequeue()).toEqual('a');
    });

    it('dequeues in correct order', function () {
        queue.enqueue('a');
        queue.enqueue('b');
        queue.enqueue('c');
        expect(queue.dequeue()).toEqual('a');

        queue.enqueue('d');
        expect(queue.dequeue()).toEqual('b');

        queue.enqueue('e');
        expect(queue.dequeue()).toEqual('c');

        queue.enqueue('f');
        expect(queue.dequeue()).toEqual('d');
        expect(queue.dequeue()).toEqual('e');
        expect(queue.dequeue()).toEqual('f');
    });
});