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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как увеличить лимит на количество символов в консоли http://www.cyberforum.ru/cpp-beginners/thread127930.html
Использую консоль для вывода информации В определенный момент старая информация затираеться Можно как то увеличить лимит на количество символов которые можно вывести в консоль ? Или вообще сделать...
C++ Даны две строки, содержащие не более 100 символов. Строки состоят из слов, разделенных пробелами. Распечатать все слова из каждой строки, начинающиеся и заканчивающие-ся на заданную букву. Добавлено через 1 час 10 минут неужели никто не знает... http://www.cyberforum.ru/cpp-beginners/thread127925.html
построение окружностей C++
Разработать программу для построения изображения, приведенного на рисунке. Исходные данные (х1, у1, х2, у2, r1, R2) должны быть заданы пользователем. Программа должна осуществлять проверку...
Ошибка при компилировании на С++ C++
Добрый день! что это такое: при компилировании на С++ возникает ошибка "unable to run program file" . Переустановка не помогает. скриншот по ссылке...
C++ Определить k-й элемент этой последовательности, введя k с клавиатуры http://www.cyberforum.ru/cpp-beginners/thread127907.html
Помогите пожалуйста написать программы с использованием циклов. Массивы не использовать. 1.Дан первый элемент последовательности и рекуррентная формула . Определить k-й элемент этой...
C++ Написать программу,которая считывает текст из файла и выводит на экран только строки,не содержащие двух значных чисел Помогите Решить! Вот Условие:Написать программу,которая считывает текст из файла и выводит на экран только строки,не содержащие двух значных чисел Вот черновик: #include <iostream> #include... подробнее

Показать сообщение отдельно
_Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200

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

12.05.2010, 07:17. Просмотров 2203. Ответов 0
Метки (Все метки)

Привет всем, Есть такая задача:
Описать класс, реализующий стек. Написать программу, использующую этот класс
для моделирования Т-образного сортировочного узла на железной дороге. Программа
должна разделять на два направления состав, состоящий из вагонов двух
типов (на каждое направление формируется состав из вагонов одного типа).
Предусмотреть возможность формирования состава из файла и с клавиатуры.

Я так понял, что нужно сначала сформировать состав и записать его в стек, затем из этого стека распределить в 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru