0

スタックとリンク リストの作成方法を学習中です。私が今書いているプログラムは、テンプレート スタック クラスに焦点を当てています。のスタックを作成したときはすべて順調に進んでいましintたが、 のスタックの実装を開始すると、プログラムがクラッシュし始めましたchar。具体的には、のスタックに pop アクションを実装しようとしたときに、めちゃくちゃになり始めましたchar

私がこれを正しく行っていることを確認し、charスタックで何が間違っているのか教えてください。

これが私のコードです:

#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");   
}
4

2 に答える 2

3
for(int i = (strSize - 1); i >= 0; **i--**) //PROBLEM not anymore
{
        charStack.pop(greeting.at(i));
        cout << greeting.at(i) << ' ';        
}
于 2013-04-11T18:41:49.483 に答える
2

おそらくそれはあなたの特定の問題の原因ではありませんが 、デストラクタdelete[] stackPtr の代わりに使用する必要があります。ウィキペディアが理由を説明delete stackPtr

于 2013-04-11T18:47:58.590 に答える