0

I'm having an issue with getting this code reversed using a linkedStack. I tried looking into it from multiple sources and found very little information that can be used to find an answer to my problem. I can understand that they are similar to one another but maybe due to me being new to coding in general, I found it very difficult to use a linkedStack with my current files.

I hope to know how I could use my current files to create a reversedQueue using a linkedStack within the arrayQueue.h and arrayQueue.cpp files.

please let me know whether I'm missing something from what I provided down below.


queueADT.h file


//Header file: queueADT.h

#ifndef _QUEUEADT_
#define _QUEUEADT_ 

#include "stackADT.h"

template <class ItemType> 
class queueADT
{
public:
    virtual void initializeQueue() = 0;
      //Function to initialize the queue to an empty state.
      //Postcondition: The queue is empty.

    virtual bool isEmptyQueue() const = 0; 
      //Function to determine whether the queue is empty.
      //Postcondition: Returns true if the queue is empty,
      //               otherwise returns false.

    virtual bool isFullQueue() const = 0;
      //Function to determine whether the queue is full.
      //Postcondition: Returns true if the queue is full,
      //               otherwise returns false.
  
    virtual ItemType front() const = 0;
      //Function to return the first element of the queue.
      //Precondition: The queue exists and is not empty.
      //Postcondition: If the queue is empty, the program 
      //               terminates; otherwise, the first 
      //               element of the queue is returned.  

    virtual ItemType back() const = 0;
      //Function to return the last element of the queue.
      //Precondition: The queue exists and is not empty.
      //Postcondition: If the queue is empty, the program 
      //               terminates; otherwise, the last 
      //               element of the queue is returned.

    virtual void reverseQueue(const ItemType& queue) = 0;

    virtual void addQueue(const ItemType& queueElement) = 0;
      //Function to add queueElement to the queue.
      //Precondition: The queue exists and is not full.
      //Postcondition: The queue is changed and queueElement
      //               is added to the queue.

    virtual void deleteQueue() = 0;
      //Function to remove the first element of the queue.
      //Precondition: The queue exists and is not empty.
      //Postcondition: The queue is changed and the first 
      //               element is removed from the queue.
};
        
#endif

arrayQueue.h file


//Header file arrayQueue
 
#ifndef _ARRAYQUEUE_
#define _ARRAYQUEUE_
  
#include <iostream> 
#include <cassert>

#include "queueADT.h"

using namespace std;

template <class ItemType>
class arrayQueue: public queueADT<ItemType>
{
public:
    const arrayQueue<ItemType>& operator=(const arrayQueue<ItemType>&); 
      //Overload the assignment operator.

    bool isEmptyQueue() const;
      //Function to determine whether the queue is empty.
      //Postcondition: Returns true if the queue is empty,
      //               otherwise returns false.

    bool isFullQueue() const;
      //Function to determine whether the queue is full.
      //Postcondition: Returns true if the queue is full,
      //               otherwise returns false.

    void initializeQueue();
      //Function to initialize the queue to an empty state.
      //Postcondition: The queue is empty.

    ItemType front() const;
      //Function to return the first element of the queue.
      //Precondition: The queue exists and is not empty.
      //Postcondition: If the queue is empty, the program 
      //               terminates; otherwise, the first 
      //               element of the queue is returned.  
    ItemType back() const;
      //Function to return the last element of the queue.
      //Precondition: The queue exists and is not empty.
      //Postcondition: If the queue is empty, the program 
      //               terminates; otherwise, the last 
      //               element of the queue is returned.

    void addQueue(const ItemType& queueElement);
      //Function to add queueElement to the queue.
      //Precondition: The queue exists and is not full.
      //Postcondition: The queue is changed and queueElement
      //               is added to the queue.

    void reverseQueue(const ItemType& queue);

    void deleteQueue();
      //Function to remove the first element of the queue.
      //Precondition: The queue exists and is not empty.
      //Postcondition: The queue is changed and the first 
      //               element is removed from the queue.

    arrayQueue(int queueSize = 100); 
      //Constructor

    arrayQueue(const arrayQueue<ItemType>& otherQueue); 
      //Copy constructor

    ~arrayQueue(); 
      //Destructor

private:
    int maxQueueSize; //variable to store the maximum queue size
    int count;        //variable to store the number of
                      //elements in the queue
    int queueFront;   //variable to point to the first
                      //element of the queue
    int queueRear;    //variable to point to the last
                      //element of the queue
    ItemType *list;       //pointer to the array that holds 
                      //the queue elements 
};

#include "arrayQueue.cpp"
#endif

arrayQueue.cpp file


template <class ItemType>
bool arrayQueue<ItemType>::isEmptyQueue() const
{
    return (count == 0);
} //end isEmptyQueue

template <class ItemType>
bool arrayQueue<ItemType>::isFullQueue() const
{
    return (count == maxQueueSize);
} //end isFullQueue

template <class ItemType>
void arrayQueue<ItemType>::initializeQueue()
{
    queueFront = 0;
    queueRear = maxQueueSize - 1;
    count = 0;
} //end initializeQueue

template <class ItemType>
ItemType arrayQueue<ItemType>::front() const
{
    assert(!isEmptyQueue());
    return list[queueFront]; 
} //end front

template <class ItemType>
ItemType arrayQueue<ItemType>::back() const
{
    assert(!isEmptyQueue());
    return list[queueRear];
} //end back

template <class ItemType>
void arrayQueue<ItemType>::addQueue(const ItemType& newElement)
{
    if (!isFullQueue())
    {   
        queueRear = (queueRear + 1) % maxQueueSize; //use mod
                            //operator to advance queueRear  
                            //because the array is circular
        count++;
        list[queueRear] = newElement;
    }
    else
        cout << "Cannot add to a full queue." << endl; 
} //end addQueue

// Test for reversing a queue using a linkedStack
template <class ItemType>
void arrayQueue<ItemType>::reverseQueue(const ItemType& queue) {
    int n = queue.front();
    
    linkedStack<int> st;
    // Remove all the elements from queue and push them to stack
    for (int i = 0; i < n; i++) {
        int curr = queue.front();
        queue.pop();
        st.push(curr);
    }
    
    // Pop out elements from the stack and push them back to queue
    for (int i = 0; i < n; i++) {
        int curr = st.top();
        st.pop();
        queue.push(curr);
    }
    
    // Print the reversed queue
    for (int i = 0; i < n; i++) {
        int curr = queue.front();
        queue.pop();
        cout<<curr<<" ";
        queue.push(curr);
    }
    cout<<endl;
}

template <class ItemType>
void arrayQueue<ItemType>::deleteQueue()
{
    if (!isEmptyQueue())
    {   
        count--;
        queueFront = (queueFront + 1) % maxQueueSize; //use the
                        //mod operator to advance queueFront 
                        //because the array is circular 
    }
    else
        cout << "Cannot remove from an empty queue." << endl;
} //end deleteQueue

    //Constructor
template <class ItemType>
arrayQueue<ItemType>::arrayQueue(int queueSize)   
{
    if (queueSize <= 0)
    {
        cout << "Size of the array to hold the queue must "
             << "be positive." << endl;
        cout << "Creating an array of size 100." << endl;

        maxQueueSize = 100;
    }
    else
        maxQueueSize = queueSize;   //set maxQueueSize to 
                                    //queueSize

    queueFront = 0;                 //initialize queueFront
    queueRear = maxQueueSize - 1;   //initialize queueRear
    count = 0;
    list = new ItemType[maxQueueSize];  //create the array to
                                    //hold the queue elements
} //end constructor

    //Destructor
template <class ItemType>
arrayQueue<ItemType>::~arrayQueue()   
{
    delete [] list;
} //end destructor

template <class ItemType>
const arrayQueue<ItemType>& arrayQueue<ItemType>::operator=
                       (const arrayQueue<ItemType>& otherQueue)
{
    cout << "Write the definition of the function "
         << "to overload the assignment operator." << endl;
} //end assignment operator

template <class ItemType>
arrayQueue<ItemType>::arrayQueue(const arrayQueue<ItemType>& otherQueue)
{
    cout << "Write the definition of the copy constructor."
         << endl;
} //end copy constructor

stackADT.h file


#ifndef _STACKADT_
#define _STACKADT_ 
  
template <class ItemType>
class stackADT
{
public:
    virtual void initializeStack() = 0;
      //Method to initialize the stack to an empty state.
      //Postcondition: Stack is empty
     
    virtual bool isEmptyStack() const = 0;
      //Method to determine whether the stack is empty.
      //Postcondition: Returns true if the stack is empty,
      //               otherwise returns false.

    virtual bool isFullStack() const = 0;
      //Method to determine whether the stack is full.
      //Postcondition: Returns true if the stack is full,
      //               otherwise returns false.

    virtual void push(const ItemType& newItem) = 0;
      //Method to add newItem to the stack.
      //Precondition: The stack exists and is not full.
      //Postcondition: The stack is changed and newItem 
      //               is added to the top of the stack.

    virtual ItemType top() const = 0;
      //Method to return the top element of the stack.
      //Precondition: The stack exists and is not empty.
      //Postcondition: If the stack is empty, the program 
      //               terminates; otherwise, the top element
      //               of the stack is returned.

    virtual void pop() = 0;
      //Method to remove the top element of the stack.
      //Precondition: The stack exists and is not empty.
      //Postcondition: The stack is changed and the top 
      //               element is removed from the stack.
};
        
#endif

linkedStack.h file


//Header File: linkedStack.h 

#ifndef _LINKEDSTACK_
#define _LINKEDSTACK_
 
#include <iostream>
#include <cassert> 
 
#include "stackADT.h"

using namespace std;

//Definition of the node 
template <class ItemType>
struct nodeType
{
    ItemType info;
    nodeType<ItemType> *link;
};

template <class ItemType>
class linkedStack: public stackADT<ItemType>
{
public:
    const linkedStack<ItemType>& operator=
                              (const linkedStack<ItemType>&);
      //Overload the assignment operator.

    bool isEmptyStack() const;
      //Function to determine whether the stack is empty.
      //Postcondition: Returns true if the stack is empty;
      //               otherwise returns false.

    bool isFullStack() const;
      //Function to determine whether the stack is full.
      //Postcondition: Returns false.

    void initializeStack();
      //Function to initialize the stack to an empty state. 
      //Postcondition: The stack elements are removed; 
      //               stackTop = nullptr;

    void push(const ItemType& newItem);
      //Function to add newItem to the stack.
      //Precondition: The stack exists and is not full.
      //Postcondition: The stack is changed and newItem 
      //               is added to the top of the stack.

    ItemType top() const;
      //Function to return the top element of the stack.
      //Precondition: The stack exists and is not empty.
      //Postcondition: If the stack is empty, the program 
      //               terminates; otherwise, the top 
      //               element of the stack is returned.

    void pop();
      //Function to remove the top element of the stack.
      //Precondition: The stack exists and is not empty.
      //Postcondition: The stack is changed and the top 
      //               element is removed from the stack.

    linkedStack(); 
      //Default constructor
      //Postcondition: stackTop = nullptr;

    linkedStack(const linkedStack<ItemType>& otherStack); 
      //Copy constructor

    ~linkedStack();
      //Destructor
      //Postcondition: All the elements of the stack are 
      //               removed from the stack.

private:
    nodeType<ItemType> *stackTop; //pointer to the stack

    void copyStack(const linkedStack<ItemType>& otherStack); 
      //Function to make a copy of otherStack.
      //Postcondition: A copy of otherStack is created and
      //               assigned to this stack.
};
#include "linkedStack.cpp"


#endif

linkedStack.cpp file


    //Default constructor
template <class ItemType> 
linkedStack<ItemType>::linkedStack()
{
    stackTop = nullptr;
}

template <class ItemType>
bool linkedStack<ItemType>::isEmptyStack() const
{
    return(stackTop == nullptr);
} //end isEmptyStack

template <class ItemType>
bool linkedStack<ItemType>:: isFullStack() const
{
    return false;
} //end isFullStack

template <class ItemType>
void linkedStack<ItemType>:: initializeStack()
{
    nodeType<ItemType> *temp; //pointer to delete the node

    while (stackTop != nullptr)  //while there are elements in 
                              //the stack
    {
        temp = stackTop;    //set temp to point to the 
                            //current node
        stackTop = stackTop->link;  //advance stackTop to the
                                    //next node
        delete temp;    //deallocate memory occupied by temp
    }
} //end initializeStack


template <class ItemType>
void linkedStack<ItemType>::push(const ItemType& newElement)
{
    nodeType<ItemType> *newNode;  //pointer to create the new node

    newNode = new nodeType<ItemType>; //create the node

    newNode->info = newElement; //store newElement in the node
    newNode->link = stackTop; //insert newNode before stackTop
    stackTop = newNode;       //set stackTop to point to the 
                              //top node
} //end push


template <class ItemType>
ItemType linkedStack<ItemType>::top() const
{
    assert(stackTop != nullptr); //if stack is empty,
                              //terminate the program
    return stackTop->info;    //return the top element 
}//end top

template <class ItemType>
void linkedStack<ItemType>::pop()
{
    nodeType<ItemType> *temp;   //pointer to deallocate memory

    if (stackTop != nullptr)
    {
        temp = stackTop;  //set temp to point to the top node

        stackTop = stackTop->link;  //advance stackTop to the 
                                    //next node
        delete temp;    //delete the top node
    }
    else
        cout << "Cannot remove from an empty stack." << endl;
}//end pop

template <class ItemType> 
void linkedStack<ItemType>::copyStack
                     (const linkedStack<ItemType>& otherStack)
{
    nodeType<ItemType> *newNode, *current, *last;

    if (stackTop != nullptr) //if stack is nonempty, make it empty
        initializeStack();

    if (otherStack.stackTop == nullptr)
        stackTop = nullptr;
    else
    {
        current = otherStack.stackTop;  //set current to point
                                   //to the stack to be copied

            //copy the stackTop element of the stack 
        stackTop = new nodeType<ItemType>;  //create the node

        stackTop->info = current->info; //copy the info
        stackTop->link = nullptr;  //set the link field of the
                                //node to nullptr
        last = stackTop;        //set last to point to the node
        current = current->link;    //set current to point to
                                    //the next node

            //copy the remaining stack
        while (current != nullptr)
        {
            newNode = new nodeType<ItemType>;

            newNode->info = current->info;
            newNode->link = nullptr;
            last->link = newNode;
            last = newNode;
            current = current->link;
        }//end while
    }//end else
} //end copyStack

    //copy constructor
template <class ItemType>   
linkedStack<ItemType>::linkedStack(
                      const linkedStack<ItemType>& otherStack)
{
    stackTop = nullptr;
    copyStack(otherStack);
}//end copy constructor

    //destructor
template <class ItemType> 
linkedStack<ItemType>::~linkedStack()
{
    initializeStack();
}//end destructor

    //overloading the assignment operator
template <class ItemType>   
const linkedStack<ItemType>& linkedStack<ItemType>::operator=
                  (const linkedStack<ItemType>& otherStack)
{ 
    if (this != &otherStack) //avoid self-copy
        copyStack(otherStack);

    return *this; 
}//end operator=
  • Stack: Last in, first out. Queue: First in, first out. – user4581301 Mar 16 '22 at 05:13
  • Unrelated possible future bug: [What are the rules about using an underscore in a C++ identifier?](https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier). – user4581301 Mar 16 '22 at 05:14
  • https://onlinegdb.com/1aOzlp8O3 – Jerry Jeremiah Mar 16 '22 at 05:23
  • I do not think that you can more easily turn a queue into a stack than write a stack from scratch. If you managed to write the queue code (well done, it is not so easy) you should be able to write the stack. Just use the same way of thinking. Maybe use the coat hanger trick. https://stackoverflow.com/questions/65726090/can-someone-explain-to-me-what-im-doing-when-creating-a-list-in-c/65726273#65726273 – Yunnosch Mar 16 '22 at 06:49

0 Answers0