2015-04-29 5 views
0

В настоящее время я работаю над реализацией структуры данных стека с использованием связанных списков на C++. Я могу скомпилировать все до тех пор, пока не проверю свой метод «stack.push», когда получаю сообщение об ошибке с отладочной ошибкой, которое у меня не было, где достаточно знаний о том, как начать исправление. Я только начал здесь, так что я не могу добавлять изображения, по-видимому, но в общем он говорит:Использование связанных списков для реализации стека, утверждение отладки не выполнено

Debug Assertion Failed! 
Program...ual studio 2013/....~ 
File:f:/dd/vctools/crt/crtw32/misc/dbgdel.cpp 
Line: 52 
Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse 

и вот мои коды: Stack.h

#ifndef _STACK_H 
#define _STACK_H 

#include "LList.h" 
typedef int ItemType; 
class Stack{ 

public: 
    Stack(); 
    ~Stack(); 

    int size() { return size_; } 
    void push(ItemType x); 
    ItemType pop(); 
    ItemType top() { return top_; } 

private: 
    ItemType top_; 
    void copy(const Stack &source); 
    int size_; 
    LList items_; 

}; 
#endif _STACK_H 

stack.cpp:

#include "Stack.h" 

Stack::Stack() 
{ 
    size_ = 0; 
    ItemType top_ = NULL; 
} 

void Stack::push(ItemType x) 
{ 
    items_.append(x); 
    size_ += 1; 
    ItemType top_ = x; 
} 
ItemType Stack::pop() 
{ 
    ItemType top_ = size_ - 1; 
    size_ -= 1; 
    return items_.pop(); 
} 

Stack::~Stack() 
{ 
    items_.~items_(); 
} 

Ошибка возникает после написания тестового кода, который назначает стек, а затем пытается нанести номер на стек. Любая помощь будет оценена, и я приношу свои извинения, если есть какие-либо проблемы с форматированием моего сообщения.

ответ

1

Вы немного смущены относительно того, что делает append. Append помещает значение (в данном случае ItemType x) в конец вашего стека, а не спереди. Затем вы назначаете вершину стека до конца стека, и вы теряете указатели на голову вашего списка.

На самом деле, сейчас есть несколько вещей, которые я не вижу, глядя на остальную часть вашего кода. Я думаю, вам не хватает понимания того, что делает Linked Lists, и вы должны пойти и прочитать их самостоятельно вместо меня, просто отменив рабочий код в своем ответе.

+0

Хорошо, из обоих ваших ответов я, очевидно, должен задуматься над этим ... Я попытаюсь найти лучшее решение – Skillapop

2

Есть несколько проблем с кодом:

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

  • Ваше использование top противоречиво, вы должны решить, что это значит. Классически вершина будет удерживать или указывать на последний вставленный элемент.

  • У вас есть проблемы с синтаксисом, и вы фактически обновляете новую локальную переменную для top вместо использования члена класса.
  • У вас есть повреждение памяти в деструкторе при явном вызове содержащего список деструктора.
+0

Хорошо, из обоих ваших ответов я, очевидно, больше думая в этом ... Я постараюсь придумать лучшее решение – Skillapop

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