2014-02-20 2 views
-1

я пытаюсь реализовать класс стека, используя связанный список здесь мой stack.hРеализация класса стека в C++

// File: Stack.h 

#ifndef STACK_H 
#define STACK_H 
class Stack 
{ 

private: 
    struct linklst{ 
     int num; 
     int* next; 
    }; 

    linklst* top; 

public: 
    Stack(); 
    ~Stack(); 

    void push(int i); 
    int pop(); 
    bool isempty(); 

}; 

#endif 

и мой стек .cpp

// Stack.cpp 

#include"Stack.h" 
using namespace std; 

Stack::Stack(){ 
    top = new linklst(); 
    top->num = -1; 
    top->next = nullptr; 

}; 

Stack::~Stack() { 

    linklst * r = new linklst(); 
    while (true) 
    { 

     r = top; 
     top = top->next; 
     delete r; 


    } 

    delete top; 


}; 

void Stack::push(int i){ 

    linklst * r = new linklst(); 
    r->num = i; 
    r->next = top; 
    top = r; 


}; 

int Stack::pop(){ 

    if (!isempty){ 
     linklst * r = top; 
     top = top->next; 
     int x = r->num; 
     delete r; 
     return x; 

    } 


}; 

bool Stack::isempty(){ 

    return (top->next == nullptr); 

}; 

Моя проблема заключается в cpp, когда я пытаюсь назначить top to r, например, например, в push-функции r-> next = top; Я получаю эту ошибку «значение типа stack :: linllst * не может быть присвоено сущности типа int *»

Кто-нибудь знает, что я делаю неправильно?

Любая помощь будет оценена Благодарности

+2

Не следует 'int * next;' be 'linklst * next;'? Узел в связанном списке должен указывать на следующий узел, а не на данные, которые содержит следующий узел. – Proxy

ответ

1

Короче говоря, связанного списка ваша структура интерфейса/данные немного от независимо от желаний стека.

Точнее, именно эта проблема является самой большой проблемой: определение вашего класса не дает вам способ вставить linklist в linklist, но это то, что вы делаете, и вполне правильно я могу добавить ,

В строке кода top = top->next; Вы пытаетесь присвоить r, указатель на linklist * к next, указатель на междунар. Как указано выше, намерение верно, определения неверны. next должен быть указателем на linklist.

struct linklst { 
    int num; // current payload 
    linklst* next; // pointer to the next linklst, NULL for EOL. (Not an int*) 
}; 

Обновлено

Для получения дополнительной информации и для других проблем в вашем коде есть взгляд на ответ Влада

+0

Я определил вершину как указатель на связанный список, как вы можете видеть в файле заголовка. Я не вижу, где я определил его как int pointer –

+0

Да, у меня была опечатка, 'top' должен был сказать' next' – UpAndAdam

5

определения Изменение структуры из

struct linklst{ 
    int num; 
    int* next; 
}; 

в

struct linklst{ 
    int num; 
    linklst* next; 
}; 

Тем не менее, даже после этого изменения ваш код будет неправильным. Например, есть утечка памяти в деструкторе

Stack::~Stack() { 

    linklst * r = new linklst(); 
    while (true) 
    { 

     r = top; 
     top = top->next; 
     delete r; 


    } 

    delete top; 


}; 

Сначала вы выделить новый linklst и назначить ему обратиться к г, но затем в цикле переназначении г. В вашей конструкции стека есть и другие ошибки

Например, нет необходимости выделять «конструктор» в конструкторе.Я бы определил конструктору следующим образом

Stack::Stack() 
{ 
    top = NULL; // or nullptr 
} 

Amd функция член IsEmpty будет выглядеть, как

bool Stack::isempty() 
{ 
    return (top == nullptr); 
} 

Также функция член поп имеет неопределенное поведение, потому что он ничего не возвращает в случае, когда стек пуст

int Stack::pop(){ 

    if (!isempty){ 
     linklst * r = top; 
     top = top->next; 
     int x = r->num; 
     delete r; 
     return x; 

    } 

}; 
+0

У этого есть много других отличных точек в дополнение к нашему общему ответу – UpAndAdam

+0

@UpAndAdam Работали ли вы на IBM? –

+0

@UpAndAdam Я написал фильтрацию записей CTRACE для сервера IBM NFS с использованием объектно-ориентированных функций PL/X. Это лучший код среди кода сервера NFS. :) –

Смежные вопросы