Что не так с моим методом pop в стеке? - PullRequest
0 голосов
/ 29 января 2019

Я делаю шаблон стека на основе указателя.Метод push работает нормально, но мой метод pop не работает.Кто-то может увидеть, что здесь не так?В GDB я показываю, что второй цикл while вызывает ошибку сегментации.В чем дело?
Вот код:

#include <iostream>
#include <string>
using namespace std;

template <typename k>
class stack;


template <typename k>
class node{
    private:
        friend class stack<k>;
        k data;
        node<k> *next;
    public:
        node(k _x): data(_x), next(NULL) {}
};
template <typename k>
class stack{
    private:
        node<k> *start;
        unsigned int i;
    public:
        stack(): start(NULL), i(0) {}
        ~stack(){
            while(i!=0) pop();
        }
        void push(k element){
            node<k> *ptr;
            node<k> *temp;
            ptr=new node<k>(element);
            if(start==NULL){
                start=ptr;
                ptr->next==NULL;
            }
            else{
                while(temp->next!=NULL) temp=temp->next;
                temp->next=ptr;
                ptr->next=NULL; 
            }
            i++;
        }
        int pop(){
            if(i==1){
                int item=start->data;
                start=NULL;
                i=0;
                return item;
            }
            else{
            node<k> *temp=start;        //k is my typenam in templates
            node<k> *top=start;
            while(temp->next!=NULL) temp=temp->next;  //getting to last element
            while(top->next!=temp) top=top->next;   //getting to element before the last
            top->next=NULL;         //setting next to NULL
            int item=temp->data;    //getting data from element popped
            delete(temp);           //deleting last node
            i--;                    //decreasing the size
            return item;            //returning popped element
            }           
        }
        bool isempty(){
            if(i==0) return 1;
            else return 0;
        }
        int rozmiar(){
                return i;
        }
};



int main()
{
    stack<char> s;
    string slowo;
    cin>>slowo;
    for(int i=0; i<slowo.length(); i++){
        s.push(slowo[i]);
    }
    for(int i=0; i<slowo.length(); i++){
        s.pop();
    }

    return 0;
}

В основном есть тест, вменяющий слово, помещающий отдельные буквы в стек, а затем читающий наоборот, используя pop.РЕДАКТИРОВАТЬ.Добавлен полный код.

1 Ответ

0 голосов
/ 29 января 2019

В вашей функции push,

    else{
        while(temp->next!=NULL) temp=temp->next;
        temp->next=ptr;
        ptr->next=NULL; 
    }

temp не инициализировано и вызывает сбой.Инициализируйте temp до start

    else{
        temp = start;
        while(temp->next!=NULL) temp=temp->next;
        temp->next=ptr;
        ptr->next=NULL; 
    }

Это должно решить вашу проблему.Вы можете проверить по

for(int i=0; i<slowo.length(); i++){
    std::cout<<(char)s.pop();
}

Input : foo
Output : oof
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...