-1
class stack_class
{
private:

    struct stack_struct *head;

public:
    stack_class();
    ~stack_class();
    void pushNumber(int number);
    void popNumber();
    void findNumber();
    void clearStack();
    void sizeFinder();
    void printStack();

};

void stack_class::popNumber()
{
    stack_struct *pointerPop=NULL,*pointerPop2=NULL;
    int popCounter=0,i=0;
    pointerPop2=tailPointer;
    if(head==NULL)
    {
        cout<<"\nNo Member to Delete.\n";
    }
    else
    {
        while(pointerPop2)
        {
            popCounter++;
            //cout<<pointerFunc3->number<<endl;
            pointerPop2=pointerPop2->next_number;
        }
        pointerPop=tailPointer;
        while(i<(popCounter-2))
        {
            pointerPop=pointerPop->next_number;
            i++;
        }
        pointerPop->next_number=NULL;
        delete head;
        head=pointerPop;
    }

}

void stack_class::printStack()
{
    pointerFunc3=tailPointer;
    if(tailPointer==NULL)
    {
        cout<<"\nNo Members in List.\n";
    }
    else
    {
        cout<<"\n\nList Is:\n";
        while(pointerFunc3)
        {
            cout<<pointerFunc3->number<<endl;
            pointerFunc3=pointerFunc3->next_number;
        }
    }

}

コンストラクタからクラスへ

stack_class::stack_class()
{
    head=NULL;
}

これは私のコードです。問題は、最後の番号をポップしてリストを印刷しようとすると、無限ループに入り、ガベージを印刷することです。リスト内のすべてを削除した後で削除オプションを押すと、プログラムがフリーズします。なぜこれがこのように動作するのか??どうすれば修正できますか?

4

1 に答える 1

1

スタックは、後入れ先出しポリシーに従うことを意図しています。スタックにプッシュした最後の数値を削除/ポップできます。そのためには、ポップは次のようにする必要があります。

int stack_class::popNumber(){
stack_struct *pointerPop=NULL; //,*pointerPop2=NULL; //not needed
int number; //number poped
//int popCounter=0,i=0;
//pointerPop2=tailPointer;
if(head==NULL)
{
    std::cout<<"\nNo Member to POP.\n";
}
else
{
    pointerPop = head;
    number = head->number;
    delete head;
    head = pointerPop;
    return number;//control ended

    //[[this part is not neccessary
    while(pointerPop2)
    {
        popCounter++;
        //std::cout<<pointerFunc3->number<<std::endl;
        pointerPop2=pointerPop2->next_number;
    }
    pointerPop=tailPointer;
    while(i<(popCounter-2))
    {
        pointerPop=pointerPop->next_number;
        i++;
    }
    pointerPop->next_number=NULL;
    delete head;
    head=pointerPop;
    //]]
}
}


void stack_class::printStack(){
stack_struct *pointer = head;
if(head == NULL)
{
    std::cout<<"\nNo Members in List.\n";
}
else
{
    std::cout<<"\n\nList Is:\n";
    while(pointer)
    {
        std::cout<<pointer->number<<std::endl;
        pointer=pointer->next_number;
    }
}}

私が見つけたキャッチ:

  1. クラスで tailPointer を宣言したことはありませんが、頻繁に使用しています。
  2. popNumber 関数は何も返しません。
  3. プッシュ機能を投稿してください また、エラーがそこにある可能性があります
于 2013-03-26T05:08:27.567 に答える