2014-11-03 2 views
0

Я пытаюсь реализовать базовый стек, чтобы увеличить понимание стеков. Я смущен, почему я могу правильно вставить в стек, но я не могу попсовать стек, я получаю ошибку seg.Pop (char &) fcn from stack of char's

Это мой файл заголовка

#include <iostream> 

using namespace std; 

class Stack { 
    public: 
      Stack(int = 10); 
      Stack(const Stack&); 
      ~Stack(); 
      Stack& operator=(const Stack&); 
      bool push(char); 
      bool pop(char &); 
      bool empty() const; 
      bool full() const; 
      bool clear(); 
    bool operator==(const Stack&) const; 
      //friend ostream& operator<<(ostream&, const Stack&); 
    private: 
      int max; 
      int top; 
      int actual; //only used in stack (stay) implementation 
      char* data; 
}; 

это мой файл реализации соответствующей информации включены только

#include <iostream> 
#include "stack.h" 

using namespace std; 

const int MAX = 9; 

Stack::Stack(int a) { 
    max = a; 
    char *data = new char[a]; 
    int top = 0; 
} 

Stack::~Stack() 
{ 
    delete[] data; 
    data = NULL; 
} 


bool Stack::push(char c) 
{ 
    if(top==9) 
    { 
     cout << "stack is full" <<endl; 
     return false; 
    } 
    else 
    top++; 
    return c; 
} 

bool Stack::pop(char &c) 
{ 
    if(top==-1) 
    { 
     cout << "Stack is empty" << endl; 
     return false; 
    } 
    c = data[top]; 
    top--; 
    return c; 

} 

вот мой тестовый файл

#include <iostream> 
    #include "stack.h" 
    //#include "queue.h" 

using namespace std; 

int main() 
{ 
    Stack *stack = new Stack(10); 

    char s = 's'; 
    char t = 't'; 
    char a = 'a'; 
    char c = 'c'; 
    char k = 'k'; 

    stack->push(s); 
    stack->push(t); 
    stack->push(a); 
    stack->push(c); 
    stack->push(k); 
    // this is where it seg faults 
    stack->pop(s); 
    stack->pop(t); 
    stack->pop(a); 

    return 0; 
} 
+0

Вы инициализируете 'top' до 0, но вы проверяете, равен ли он -1, чтобы определить, является ли он пустым. Один из этих двух не прав. Как написано, вы можете построить 'Stack', а затем сразу же вызвать' pop() '(теоретически) успешно. Ваш 'push()' также никогда не переносит переданное значение в ваш массив. – cdhowie

+0

@cdhowie я исправил свою инициализацию, должно быть, была опечатка. Как мне нужно изменить push, чтобы на самом деле поместить значение, и pop, чтобы вывести значение? – matt

ответ

2
char *data = new char[a]; 
int top = 0; 

Эти строки создают new local переменные в конструкторе. Это означает, что поле data в вашем классе никогда не назначается и, следовательно, является неинициализированным указателем; вы пытаетесь прочитать значения из неопределенной ячейки памяти в pop().

Вы должны установить элементы данных объекта вместо:

data = new char[a]; 
top = -1; // Should actually be -1 according to your test in pop() 

Некоторые другие примечания:

  • В push() вы никогда не храните аргумент в data, так что это будет никогда не читайте. pop() вернет данные из неинициализированной памяти, так что вы пытаетесь попсовать, это мусор.
  • В конструкторе вы можете использовать список инициализации вместо присваивания:

    Stack::Stack(int a) 
        : max(a), 
         top(-1), 
         data(new char[a]) 
    { } 
    
+0

спасибо за вашу помощь, seg fault больше не существует. Итак, говоря: data = new char [a], im перемещает это из локальной переменной в стек, с которым я могу обходиться? также, с top = -1, мне не нужен int top = 1 beccause, уже сказал, что его int в .h? – matt

+0

@matt Говоря 'data = new char [a]' вы назначаете кучу новый массив 'char', содержащий элементы' a', и сохраняете указатель на этот массив в поле 'data' объекта' Stack'. 'char * data = new char [a]' делает то же самое, за исключением того, что он хранит указатель в переменной local для конструктора, переменную, которая теряется при возвращении конструктора. – cdhowie

0

Вы должны сделать свой ум, хотите ли вы top быть индекс верхнего элемента, или число элементы в стеке и, следовательно, один за ним. Последний более распространен и подходит вам при инициализации top = 0. Но тогда вы хотите проверить на top == 0 в методе pop, а также хотите сначала уменьшить значение top и использовать его для индексации элемента после его декрементации.