Eric after dark
Eric after dark

Reputation: 1808

Stack of char issue

I'm in the process of learning how to create Stacks and linked lists. The program that I'm writing right now focuses on a template stack class. Everything was going smoothly when I made a stack of int, but my program started crashing when I started implementing a stack of char. To be specific it started messing up when I tried to implement a pop action on the stack of char.

Can you guys please verify that I'm doing this correctly and also let me know what I'm doing wrong with char stack?

Here's my code:

#include<iostream>
using namespace std;

#ifndef STACK_H
#define STACK_H

//STACK CLASS
template<typename T>
class Stack
{
 public:
        Stack(int = 10);
        ~Stack(){ delete stackPtr;};

        bool isEmpty() const
        { return top == -1; }

        bool isFull() const
        { return top == size - 1; }

        //push and pop
        bool push(const T&);
        bool pop(T&);

 private:
         int size;
         int top;
         T *stackPtr;
};

//CONSTRUCTOR
template<typename T>
Stack<T>::Stack(int newSize)
     : top(-1), size(newSize), 
     stackPtr(new T[size]) //allocate array using ptr ********
{
     //empty constructor
};

//PUSH VALUES ONTO STACK
template<typename T>
bool Stack<T>::push(const T &pushVal)
{
     if(!isFull())
     {
            stackPtr[++top] = pushVal;
            return true;      
     }

     return false;
};

//POP VALUES OFF OF STACK
template<typename T>
bool Stack<T>::pop(T &popVal)
{
     if(!isEmpty())
     {
            popVal = stackPtr[top--];
            return true;              
     }

     return false;
};

#endif

//DRIVER
int main()
{
    //STACK OF INT
    Stack<int> intStack(5);
    int intValue = 1;

    cout << "Pushing values onto intStack: " << endl;

    while(intStack.push(intValue))
    {
        cout << intValue << ' ';
        intValue++;                               
    }
    cout << "\nStack is full, cannot push..."
         << endl << endl;

    cout << "Popping values off of intStack: " << endl;

    while(intStack.pop(intValue))
         cout << intValue << ' ';

    cout << "\nStack is empty, cannot pop..."
         << endl;

    //STACK OF CHAR
    Stack<char> charStack(5);
    string greeting = "hello";
    int strSize = greeting.length();

    cout << "\nPushing values onto charStack: " << endl;

    for(int i = 0; i < strSize; i++)
    {
         charStack.push(greeting.at(i));
         cout << greeting.at(i) << ' ';
    }        

    cout << endl;

    cout << "Popping values off of charStack: " << endl;

    for(int i = (strSize - 1); i >= 0; i++) //PROBLEM OCCURS
    {
            charStack.pop(greeting.at(i));
            cout << greeting.at(i) << ' ';        
    }

    system("pause");   
}

Upvotes: 0

Views: 3175

Answers (2)

user500944
user500944

Reputation:

Probably it's not the source of your particular problem, but you really should use delete[] stackPtr instead of delete stackPtr in your destructor. Wikipedia explains why

Upvotes: 2

joy
joy

Reputation: 1569

for(int i = (strSize - 1); i >= 0; **i--**) //PROBLEM not anymore
{
        charStack.pop(greeting.at(i));
        cout << greeting.at(i) << ' ';        
}

Upvotes: 3

Related Questions