Форум программистов, компьютерный форум CyberForum.ru

Класс, реализующий стек - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
12.05.2010, 07:17     Класс, реализующий стек #1
Привет всем, Есть такая задача:
Описать класс, реализующий стек. Написать программу, использующую этот класс
для моделирования Т-образного сортировочного узла на железной дороге. Программа
должна разделять на два направления состав, состоящий из вагонов двух
типов (на каждое направление формируется состав из вагонов одного типа).
Предусмотреть возможность формирования состава из файла и с клавиатуры.

Я так понял, что нужно сначала сформировать состав и записать его в стек, затем из этого стека распределить в 2 стека по типу вагонов.

Вообщем начал решать задачу, написал метод помещения в стек, проверяю - вагон действительно помещается, но при выходе из программы вылетает ошибка((:

"Unhandled exception at 0x10252758 (msvcr80d.dll) in Stack.exe: 0xC0000005: Access violation reading location 0xfeeefee2."
и открывается файл dbgdel.cpp на строке :
/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

Я так подозреваю дело в деструкторе, но не пойму в чем именно:
Вот мой код:

Файл Stack.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <windows.h>
 
class Stack{
    
private:
    struct Node{
        int num_coach;
        Node* prev;
    };
    Node* top;
 
public:
    Stack ();
    ~Stack();
    Node** GetTop();
    int GetNumCoach(Node** top);
    void push(Node **top, int p_num_coach);
    //Node* pop(Node **top);    
 
};]
Файл Stack.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "Stack.h"
 
using namespace std;
 
Stack::Stack(){
    top = 0;
    cout << "Конструктор работает" << endl;
 
}
 
Stack::~Stack(){
    while(top){
        Node *pv = top;
        delete pv;
        top = top->prev;
    }
    cout << "Деструктор работает" << endl;
}
 
Stack::Node** Stack::GetTop(){
    return &top;
}
 
int Stack::GetNumCoach(Stack::Node **top){
 
    return (*top)->num_coach;
    
}
 
void Stack::push(Stack::Node **top, int p_num_coach){
 
    Stack::Node* pv = new Stack::Node;
 
    if (top) {
        
        pv->prev = *top;
        pv->num_coach = p_num_coach;
        *top = pv;
    }
    else{
        pv->num_coach = p_num_coach;
        pv->prev = 0;
        *top = pv;
    }
 
}
Файл Main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <conio.h>
 
#include "Stack.h"
 
using namespace std;
 
int main(){
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    cout << "Программа запущена" << endl;
 
    Stack empty_coach;
 
    empty_coach.push(empty_coach.GetTop(), 1024);   
 
    cout << empty_coach.GetTop() << endl;
    cout << empty_coach.GetNumCoach(empty_coach.GetTop()) << endl;
 
    
    _getch();
    return 0;
}
Добавлено через 10 часов 48 минут
Люди, добрые, помогите разобраться пожалуйста.

Добавлено через 6 часов 41 минуту
Все нашел ошибку, в деструкторе
C++
1
2
3
4
5
6
7
8
Stack::~Stack(){
        while(top){
                Node *pv = top;
                delete pv;
                top = top->prev;
        }
        cout << "Деструктор работает" << endl;
}
я объявил указатель на вершину стека, очистил памать на которую он указывал и пытаюсь присвоить вершине указатель на предыдущий элемент. Надо было сначала изменить вершину, а потом уже очищать память:
C++
1
2
3
4
5
6
7
8
Stack::~Stack(){
        while(top){
                Node *pv = top;                
                top = top->prev;
                delete pv;
        }
        cout << "Деструктор работает" << endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2010, 07:17     Класс, реализующий стек
Посмотрите здесь:

C++ Описать класс, реализующий стек целых чисел типа LIFO.
Класс, реализующий стек. Перегрузка операций взятия и извлечения элемента. C++
C++ класс, реализующий стек
C++ Описать класс, реализующий стек
Описать класс, реализующий стек C++
C++ Описать класс, реализующий стек и работу с ним
C++ Написать класс, реализующий Стек
Описать класс, реализующий стек и работу с ним C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 14:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru