0

So in my assignment we're supposed to be creating a Stack class that creates a stack using array implementation for values of type double.

Here's the header file:

#ifndef STACK_H
#define STACK_H

class Stack
{
    private:
        double *stackArray;             //Pointer to the Stack array.
        int stackSize;                  //The size of stack.
        int top;                        //The first "plate" on top of the stack/Holds the index of the first element in the stack
        
        void copy(const Stack &copy);  //The fxn the copy constructor calls. 
        void destroy();                 //The fxn the destructor calls.
        void resize();                  //Makes the array larger if capacity has been reached.
        
    public:
        Stack();                    //Default Constructor
        /***
        Stack(const Stack&);            //Copy Constructor 
        ***/
        
        ~Stack();                          //Destructor 
        
        
        //STACK OPERATIONS:
        void push(double);              //Adds a 'plate' on top of the stack. 
        
        void pop();             //Removes 'plate' on top of stack. 
        
        bool isEmpty();           //Returns true if stack is empty, false otherwise.
        
        bool isFull();            //Returns true if stack is full, false otherwise.
        
        double peek();                  //Gets the top item of the stack without removing the item. 
        
        int getSize();                  //Makes the array larger if the capacity of the array is being reached. 
        
        void display() const;  //Displays the values in the stack.
};
#endif 

Heres the implementation file:

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


Stack::Stack()                    //The Constructor 
{
    stackSize = 1;
    stackArray = new double[stackSize];       //Dynamically allocate memory for an array of a stack variable.
    top = -1;                           //Set the top of the stack to -1. So its empty.
}

/***
Stack::Stack(const Stack &obj)                     //The Copy constructor 
{
    copy(const Stack &copy);
}
***/


Stack::~Stack()                         //The destructor 
{
    destroy();                          //Calls the destroy function to delete the array.
}




void Stack::push(double value)          //Adds a new 'plate' on the stack 
{
    if (isFull())
    {
        resize();                       //Makes a new stack that is double the size of the current one 
                                       //While copying all values of the previous stack.
        push(value);
    }
    
    top++;                                  //Increment top....
    stackArray[top] = value;                //...So we can make 'value' the new top in the array.
}


void Stack::pop()                 //Removes a 'plate' from the stack 
{
    if (isEmpty())
    {
        cout << "The stack is empty.\n";
    }
    else                                        //Otherwise...
    {
        top--;                                  //Removes the current value of top from the stack. 
    }
}


bool Stack::isEmpty() 
{
    bool status;                        //Tells the current status of the stack
    
    if (top == -1)                           //If theres nothing in the stack...
    {
        status = true;                 //...status returns true. 
    }
    else                              //Otherwise...
    {
        status = false;              //...The stack MUST have something already in it.
    }
    
    return status;                  
}


bool Stack::isFull() 
{
    bool status;                    
    
    if (top == stackSize - 1)               //Checks if the top of the stack is equal to the max stack size entered.
        status = true;                      //Returns true if stack is full.
    else
        status = false;                     //Or false if not.
    
    return status;          
}


void Stack::destroy()
{
    delete [] stackArray;           //Delete the Stack Array.
}


double Stack::peek()            //Gets the top item of the stack without removing item 
{
    return stackArray[top];
}


int Stack::getSize()                                        //Determines the size of the stack
{
    return top + 1;
}


void Stack::resize()
{
    
    stackSize *= 2;                                         //Make the stackSize of the new array 
                                                            //AT LEAST TWICE as big as the previous one. 

   double *stackArray2nd = new double[stackSize];                     //Make new array
    
    for (int index = 0; index <= top; index++)
    {
        stackArray2nd[index] = stackArray[index];          //Make the new stack array equal to the old stack array.
    }
    
    destroy();
    stackArray = stackArray2nd;                         //Stack array no longer has a size associated with it 
}




void Stack::copy(const Stack &copy)    
{
    stackSize = copy.stackSize;                         //Copy the stackSize attribute.
    
    for (int index = 0; index < stackSize; index++)    //Copy the Stack's contents 
        stackArray[index] = copy.stackArray[index];    
        
    top = copy.top;                                   //Set the top of the stack.
}


void Stack::display() const                       //Prints out the stack 
{
    for (int index = 0; index <= top; index++)
    {
        cout << stackArray[index] << " ";
    }
    cout << endl;
}

And here's the driver program:

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

int main()
{
    
    Stack stack1;
    
    cout << "Lets get the stack size!\n";           //Check to see if the getSize function works 
    cout << stack1.getSize();
    
    cout << "\nLets see if we can add a value on to the stack!\n";
    stack1.push(33.2);
    stack1.display();
    
    cout << "\nLets add another.\n";
    stack1.push(27.4);
    stack1.display();

    return 0;
}

My issue is that when I try to run it, it compiles, but for some reason I get this:

Lets get the stack size!
0
Lets see if we can add a value to the stack!
33.2

Lets add another.
33.2 27.4 27.4

Why does it add another 27.4? Also theres the issue where I cant seem to get the value being pushed into the array get printed out as the first value on the far left side.

Please help! I'm not exactly sure why this is happening.

Cyrus Lee
  • 27
  • 4
  • Inside of `push()`, if `isFull()` is true, `push(value)` doesn't belong and should be removed. That is where your duplicate value is coming from. As for the order of the display, you are pushing values on the back end of the array, and then looping from front to back. Obviosly, if you want the display to be reversed, you need to switch the direction of one of those operations. Push values on the front end of the array instead, or else loop from back to front. – Remy Lebeau Mar 04 '21 at 00:42
  • On a side note, `copy()` is not allocating `stackArray` before copying values into it. – Remy Lebeau Mar 04 '21 at 00:44
  • *"Why does it add another 27.4"* - because *you* did. You recursively invoke `push` *and* amend the value at the end of the function. The latter will skip the resize (because it is no longer needed), then amend the value, and then you do it again. Either get rid of the recursive call or buy an `else`. – WhozCraig Mar 04 '21 at 00:54

0 Answers0