I'm working on visual studio. My project is: Write a stack and queue test driver. A test driver is a program created to test functions that are to be placed in a library. Its primary purpose is to completely test functions therefore it has no application use. You will use two stacks and two queues in the program, as described below.
a. inS – input stack: used to store all user input
b. inQ – input queue: used to store all user input
c. outS – output stack: used to store data deleted from inQ
d. outQ – output queue: used to store data deleted from inS
And I need to do the following in main: I – insert, D – delete, C – display the number of elements in the two stacks and two queues, T – display the elements at the top of the two stacks, F – display the elements at the front of the two queues, R – display the elements at the end of the two queues
Like this, I'm trying to work on queues and stacks. But the below is shown.
//
// delete_scalar.cpp
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// Defines the scalar operator delete.
//
#include <crtdbg.h>
#include <malloc.h>
#include <vcruntime_new.h>
#include <vcstartup_internal.h>
////////////////////////////////////////////////////////////////
// delete() Fallback Ordering
//
// +-------------+
// |delete_scalar<----+-----------------------+
// +--^----------+    |                       |
//    |               |                       |
// +--+---------+  +--+---------------+  +----+----------------+
// |delete_array|  |delete_scalar_size|  |delete_scalar_nothrow|
// +--^----^----+  +------------------+  +---------------------+
//    |    |
//    |    +-------------------+
//    |                        |
// +--+--------------+  +------+-------------+
// |delete_array_size|  |delete_array_nothrow|
// +-----------------+  +--------------------+
_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
    #else
    free(block);
    #endif
}
The below is the whole code(two .h files and one .cpp files). 1. stackADT.h
    /**~*~*
       Stack template
    *~**/
    #ifndef STACK_ADT_H
        #define STACK_ADT_H
    #include <iostream>
using namespace std;
template <class T>
class Stack
{
private:
    // Structure for the stach nodes
    struct StackNode
    {
        T value;          // Value in the node
        StackNode *next;  // Pointer to next node
    };
    StackNode *top;     // Pointer to the stack top
    int count;
public:
    //Constructor
    Stack() { top = NULL; count = 0; }
    // Destructor
    ~Stack();
    // Stack operations
    bool push(T);
    bool pop(T &);
    bool isEmpty();
    int getCount();
    bool getTop(T &);
};
/**~*~*
   Destructor
*~**/
template <class T>
Stack<T>::~Stack()
{
    StackNode *currNode, *nextNode;
    // Position nodePtr at the top of the stack.
    currNode = top;
    // Traverse the list deleting each node.
    while (currNode) //while (currNode != NULL)
    {
        nextNode = currNode->next;
        delete currNode;
        currNode = nextNode;
    }    
}
/**~*~*
  Member function push pushes the argument onto
  the stack.
*~**/
template <class T>
bool Stack<T>::push(T item)
{
    StackNode *newNode; // Pointer to a new node
    // Allocate a new node and store num there.
    newNode = new StackNode;
    if (!newNode)
        return false;
    newNode->value = item;
    // Update links and counter
    newNode->next = top;
    top = newNode;
    count++;
    return true;
}
/**~*~*
  Member function pop pops the value at the top
  of the stack off, and copies it into the variable
  passed as an argument.
*~**/
template <class T>
bool Stack<T>::pop(T &item)
{
    StackNode *temp; // Temporary pointer
    // empty stack
    if (count == 0)
        return false;
    // pop value off top of stack
    item = top->value;
    temp = top->next;
    delete top;
    top = temp;
    count--;
    return true;
}
/**~*~*
  Member function isEmpty returns true if the stack
  is empty, or false otherwise.
*~**/
template <class T>
bool Stack<T>::isEmpty()
{
    return count == 0;
}
/**~*~*
  Member function getCount returns
  the number of elements in the stack
*~**/
template <class T>
int Stack<T>::getCount()
{
    return count;
}
/**~*~*
  Member function getTop copies the value at the top
  of the stack into the variable passed as an argument.
*~**/
template <class T>
bool Stack<T>::getTop(T &item)
{
    if (top == NULL)
        return false;
    item = top->value;
    return true;
}
#endif
- QueueADT.h - #ifndef DYNAMICQUEUE_H #define DYNAMICQUEUE_H #include <iostream> using namespace std; template <class T> class Queue { private: // Structure for the queue nodes struct QueueNode { T value; // Value in the node QueueNode *next; // Pointer to next node }; QueueNode *front; // Pointer to the queue front QueueNode *rear; // Pointer to the queue rear int count; public: //Constructor Queue() { front = rear = NULL; count = 0; } // Destructor ~Queue(); // Queue operations bool enqueue(T); bool dequeue(T &); bool isEmpty(); int getCount(); bool queueFront(T &); bool queueRear(T &); }; /**~*~* Destructor *~**/ template <class T> Queue<T>::~Queue() { QueueNode *currNode, *nextNode; // Position nodePtr at the top of the stack. currNode = front; // Traverse the list deleting each node. while (currNode) //while (currNode != NULL) { nextNode = currNode->next; delete currNode; currNode = nextNode; } } /**~*~* Member function getCount returns the number of elements in the queue *~**/ template <class T> int Queue<T>::getCount() { return count; } /**~*~* Member function isEmpty returns true if the stack is empty, or false otherwise. *~**/ template <class T> bool Queue<T>::isEmpty() { return count == 0; } /**~*~* Member function enqueue inserts the argument into the queue. *~**/ template <class T> bool Queue<T>::enqueue(T item) { QueueNode *newNode; // Pointer to a new node // Allocate a new node and store num there. newNode = new QueueNode; if (!newNode) return false; newNode->value = item; // Update links and counter newNode->next = NULL; if (front == NULL) // insert to an empty queue front = newNode; else rear->next = newNode; count++; rear = newNode; return true; } /**~*~* Member function dequeue deletes the value at the front of the queue, and copies it into the variable passed as an argument. *~**/ template <class T> bool Queue<T>::dequeue(T &item) { QueueNode *pDel; // Temporary pointer // empty queue if (count == 0) return false; // delete the value at the front of the queue item = front->value; pDel = front; if (count == 1) rear = NULL; front = front->next; count--; delete pDel; return true; } /**~*~* Member function queueFront copies the value at the front of the queue into the variable passed as an argument. *~**/ template <class T> bool Queue<T>::queueFront(T &item) { if (front == NULL) return false; item = front->value; return true; } /**~*~* Member function queueRear copies the value at the rear of the queue into the variable passed as an argument. *~**/ template <class T> bool Queue<T>::queueRear(T &item) { if (rear == NULL) return false; item = rear->value; return false; } #endif
3.Main.cpp
/**
CIS 22C: Homework 3
Build and process a sorted circularly doubly-linked list of Toy objects.
The list is sorted in ascending order by toy ID.
The toy ID is a unique key.
IDE: Visual Studio
Written By: Younseo Ryu
Changed By:
**/
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <cctype>  // toupper function
#include "StackADT.h"
#include "QueueADT.h"
using namespace std;
void printWelcome();
void insertSQ(Stack<double> &, Queue<double> &);
void deleteSQ(Stack<double> &, Stack<double> &, Queue<double> &, Queue<double> &);
void displayCountSQ(Stack<double>, Stack<double>, Queue<double>, Queue<double>);
void displayTopS(Stack<double>, Stack<double>);
void displayEndQ(Queue<double>, Queue<double>);
int main()
{
    Stack<double> inS; Stack<double> outS;
    Queue<double> inQ; Queue<double> outQ;
    printWelcome();
    insertSQ(inS, inQ);
    insertSQ(inS, inQ);
    insertSQ(inS, inQ);
    deleteSQ(inS, outS, inQ, outQ);
    displayCountSQ(inS, outS, inQ, outQ);
    displayTopS(inS, outS);
    displayEndQ(inQ, outQ);
    system("pause");
    return 0;
}
/**********************
This function prints a welcome message and a description of the program
*********************/
void printWelcome()
{
    cout << "\n\n\t\t *~~*~~* WELCOME *~~*~~*\n\n"
        << "\tTo the Stack and Queue Program!\n\n"
        << "\t\tThis program will: \n"
        << "\t\t -I: Insert \n"
        << "\t\t -D: Delete  \n"
        << "\t\t -C: Display the number of elements in the two stacks and two queues \n"
        << "\t\t -T: Display the elements at the top of the two stakcs \n"
        << "\t\t -F: disdisplay the elements at the front of the two queues \n"
        << "\t\t -R: display the elements at the end of the two queues \n"
        << "\t\t -Q: to quit the program. \n\n\n";
    cout << "\t\t \n\n";
}
void insertSQ(Stack<double> &stack, Queue<double> &queue)
{
    double item;
    cout << "enter a number to insert it in inS and inQ: ";
    cin >> item; 
    stack.push(item);
    queue.enqueue(item);
}
void deleteSQ(Stack<double> &inS, Stack<double> &outS, Queue<double> &inQ, Queue<double> &outQ)
{
    double item;
    cout << "the top stack element is popped.\n";
    inS.pop(item);
    outS.push(item);
    inQ.dequeue(item);
    outQ.enqueue(item);
}
void displayCountSQ(Stack<double> inS, Stack<double> outS, Queue<double> inQ, Queue<double> outQ)
{
    cout << "there are " << inS.getCount() << " elements in the stack inS\n"
         << "there are " << outS.getCount() << " elements in the stack outS\n"
         << "there are " << inQ.getCount() << " elements in the queue inQ\n"
         << "there are " << outQ.getCount() << " elements in the queue outQ\n";
}
void displayTopS(Stack<double> inS, Stack<double> outS)
{
    double item;
    if (inS.getTop(item))
        cout << "the top element in the stack inS is the following: " << item << "\n";
    else
        cout << "the stack inS is empty. so there's no top element in inS.\n";
    if(outS.getTop(item))
        cout << "the top element in the stack outS is the following: " << item << "\n";
    else
        cout << "the stack outS is empty. so there's no top element in inS.\n";
}
void displayEndQ(Queue<double> inQ, Queue<double> outQ)
{
    double item;
    if (inQ.queueFront(item))
        cout << "the front element of the queue inQ is: " << item <<"\n";
    else cout << "no front element found in inQ\n";
    if (inQ.queueRear(item))
        cout << "the rear element of the queue inQ is: " << item << "\n";
    else cout << "no rear element found in inQ\n";
    if (outQ.queueFront(item))
        cout << "the front element of the queue inQ is: " << item << "\n";
    else cout << "no front element found in inQ\n";
    if (outQ.queueRear(item))
        cout << "the rear element of the queue inQ is: " << item << "\n";
    else cout << "no rear element found in inQ\n";
}
