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

Объясните, как происходит вывод элемента из "стека", списки\структуры - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Составить программу имитирующую пользовательский интерфейс http://www.cyberforum.ru/cpp-beginners/thread883614.html
Составить программу имитирующую пользовательский интерфейс с использованием меню, переключателей и радио кнопок.
C++ Нарисовать блок схему по готовой пограмме #include <iostream> #include <ctime> using namespace std; int main() { setlocale(LC_ALL, "Russian"); //устанавливаем русский язык в консоли srand (time(NULL)); http://www.cyberforum.ru/cpp-beginners/thread883601.html
C++ Метод конечных разностей для краевой задачи
Помогите пожалуйста. Надо написать программу, которая решает краевую задачу для ОДУ 2 порядка методом конечных разностей. Никак не могу разобраться, подскажите хотя бы, с чего начать? Или может у...
Дан файл, содержащий сведения об игрушках (название, стоимость, возрастные границы). Получить сведения: C++
народ помогите пожалуйста написать программу на с++ Дан файл , содержащий сведения об игрушках: указывается название игрушки (например, кукла, кубики, мяч, конструктор и т.д.), ее стоимость в...
C++ Создание таблиц меток http://www.cyberforum.ru/cpp-beginners/thread883548.html
Здравствуйте.Надо составить программу таблиц меток из текста программы. В тексте программы есть метки и составляется программа в которой для каждой метки указывается название,номер строки,имя...
C++ Вычислить среднее геометрическое пяти вводимых чисел Вычислить среднее геометрическое пяти вводимых чисел подробнее

Показать сообщение отдельно
Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 300
Завершенные тесты: 1

Объясните, как происходит вывод элемента из "стека", списки\структуры - C++

29.05.2013, 15:22. Просмотров 443. Ответов 2
Метки (Все метки)

Таааак, разобравшись со списками, найдя неплохой стек, реализацию через списки, динамический стек, возник вопрос по поводу вывода:
Т.е., если мы будем вводить числа: 23,24,25,26 и сделаем запрос на вывод всего стека. то вывод будет 26,25,24,23.
Почему именно так? Почему не начинается с головы? Как такое случилось, что идём в обратную сторону? Пожалуйста, подскажите как это работает.


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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
struct Stack
{
    int info; // some info
    Stack *next;
};
 
Stack* push(Stack *tos, int info);
Stack* pop(Stack *tos);
void print(Stack *tos);
Stack* deleteAll(Stack *tos);
 
 
void main()
{
    setlocale(0,"");
    int a,info;
 
    Stack *head=NULL;
 
    
    
    
    do
    {
        cout << "Что будем делать со стеком?\n1 - Добавим элемент в стек.\n2 - Удалим элемент из стека.\n3 - Выведем стек на экран.\n0 - Выход.\n\n";
        cin >> a;
        switch (a) 
        {
            case 1: 
            {
                cin >> info;
                head=push(head,info);
                break;
            }
            case 2: 
            {
                 head=pop(head);
                break;
            }
            case 3: 
            {
                print(head);
                break;
            }
            default:
            {
                system("cls");
                cout << "ERROR!";
                break;
            }
        }
 
    cout << "\n\n";
    system("PAUSE");
    system("cls");
    }
    while (a!=0);
 
    cin.get();
    cin.get();
}
 
 
Stack* push(Stack *tos, int info)
{
    // передаем указатель на голову стека tos 
    Stack *newCell;
 
    if (tos == NULL) // если ничего нет (стек пуст)
    {
        tos = new Stack();// захватываем память под новый элемент.
        tos->next = NULL; 
        tos->info= info; 
        return tos; // и возвращаем голову.
    }
 
    // иначе
    newCell = new Stack(); // захватываем память под новый элемент
    newCell->next = tos; //  указателю next присваиваем адрес уже имеющегося стека (новый элемент становится головой)
    newCell->info = info;
 
    return newCell; // и возвращаем новую голову стека.
    
}
 
 
Stack* pop(Stack *tos)
{
    Stack *cell;
 
    if (tos == NULL) // если стек пуст
    {
        cout << "   Stask is empty" << endl;
        return tos;
    }
    cell = tos->next; // сохраняем в переменную cell следующий, после головы элемент.
 
    delete tos; // удаляем голову стека
 
    return cell; // возвращам сell - новая голова стека.
}
 
 
void print(Stack *tos)
{
    Stack *current; // указатель на текущую ячейку
 
    if (tos == NULL)
    {
        cout << "   Stask is empty" << endl;
        return;
    }
 
    current = tos;
 
    while (current != NULL) // пока не конец стека (не достигнуто NULL)
    {
        cout << "   " << current->info << endl; //  выводим информацию
        current = current->next;  //  переходим к след элементу
    }
}
 
 
Stack* deleteAll(Stack *tos)
{
    Stack *current = tos;
 
    while (current != NULL)
    {
        current  = tos->next;
 
        delete tos; //  аналогично выводу, только удаляем каждый элемент
 
        tos = current;
    }
 
    return current;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru