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

Стек из списка - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Комментарии к коду http://www.cyberforum.ru/cpp-beginners/thread425997.html
Имеются ряд вопросов по коду. 1.Что нужно переделать ,для того чтобы добавить шаблоны? 2. Прокомментируйте пожалуйста код. Заранее благодарен.
C++ Вычислить произведение компонент вектора размером 5 Не могу выполнить Выяснить, в любой из строк матрицы размера 4x5 хотя бы один нулевой элемент. Воспользоваться функцией, которая вычисляет произведение компонент вектора размером 5. http://www.cyberforum.ru/cpp-beginners/thread425992.html
Многофайловые программы C++
Цитата: «В проэкты включаються только файлы исходного кода, а не заголовочные файлы. В интегрированных средах разработки программ не следует добавлять заголовочные файлы к списку проэкта (project list);нельзя также использовать директиву #include для включения одних файлов исходного кода в другие файлы исходного кода.» Как это практически реализовать, если надо включить в проэкт 2 файла...
C++ Удаление из строки s все последовательности трёх букв ABC
Только начал освоивать язык С и не могу выполнить задачу Нужно удалить из строки символов s все последователности трёх латинских букв ABC на языке С!
C++ Задача на С++. Алгоритмы библиотеки STL. http://www.cyberforum.ru/cpp-beginners/thread425988.html
Программа должна демонстрировать использование контейнерных классов для хранения встроенных типов данных. В программе выполнить следующее: 1. Создать объект-контейнер multimap и заполнить его данными типа int. 2. Просмотреть контейнер. 3. Изменить контейнер, удалив из него одни элементы и заменив другие. 4. Просмотреть контейнер, используя для доступа к его элементам итераторы. ...
C++ Множественное наследование Листинг: #include <iostream> using namespace std; class Person{private: string Fname,Sname,years;}; class Student{private: string group;}; class Tich:public Person{private: string Profession;}; class GradStudent:public Student,public Person,public Tich{}; int main(){} подробнее

Показать сообщение отдельно
Basisd
2 / 2 / 0
Регистрация: 09.12.2010
Сообщений: 39

Стек из списка - C++

11.01.2012, 05:51. Просмотров 918. Ответов 11
Метки (Все метки)

Здравствуйте, обращаюсь за помощью не в первый раз, всегда помогали, отдельное спасибо. Задача такая. Реализовать стек с помощью списка и осуществить добавление элементов, ну и просмотр. Я лентяй, решил воспользоваться чужим кодом. Напишите пожалуйста функцию, осуществляющую просмотр добавленных элементов, желательно с комментариями, хочу понять это всё, чтобы не было лишних вопросов в следующий раз, спасибо.

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
# include<iostream>
# include<conio.h>
# define SIZE 3
using namespace std;
 
//Каждый элемент массива суть структура, состоящая из двух полей.
//Первое поле- САМО значение элемента массива
//Второе- указатель на следующую структуру
struct element {
 int el;
 element* pel;  
}; 
 
//Все функции будут работать с адресами элементов element. Это глобальная переменная,
//она содержит адрес структуры
element* adres_nulevogo_elementa;
 
 
class stack {
 
 private:
 element a [SIZE];
 //Индексы как в прошлом примере не нужны, будем обходиться  переменной pel
 
 public:
        stack();
        void push(int);
        int pop();
 
        //Эта функция возвращает значение a. И всё!.Она нужна будет тогда только, когда будем 
        //инициализировать статическую переменую adres_nulevogo_elementa и когда будем проверять
        //не пустой ли стек.
        element* vozvr () {return a;}
 
};
 
//+++++++++++++++++++++++++++++++++++++++++++++++Конструктор+++++++++++++++++++++++++++++++++++++++++
 
//Это конструктор
//При объявлении объекта типа stack все поля el переменных типа element устанавливаются в ноль
//А все поля pel переменных типа element содержат адреса СЛЕДУЮЩЕЙ ПЕРЕМЕННОЙ типа element
//На то он и связный список
//Делаем всё это дело в цикле
stack::stack(){
 
 int i= 0;
 
 for (; i< SIZE- 1; i++) {
  a[i].el= 0;
  a[i].pel= &a [i+1];
 }
 
 //Последний элемент заполняем отдельно, ибо второе его поле должно одержать нулевой указатель
 a [i].el= 0;
 a [i].pel= 0;
 
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 
void stack::push(int i){
 
 //Здесь решено отказаться от использования функции isfull. Просто смотрим, куда
 //указывает переменная adres_nulevogo_elementa 
 
 if(adres_nulevogo_elementa) {
  adres_nulevogo_elementa->el= i;
 
  //Поле adres_nulevogo_elementa-> не запоняем, ибо оно уже заполнено конструктором.
  //А вот значение переменной adres_nulevogo_elementa изменяем
  adres_nulevogo_elementa= adres_nulevogo_elementa->pel;
 }
 else {
  cout<<"Stack overflow error !  Possible Data Loss !";
 }
}
 
int stack::pop(){
 
 //Здесь тоже решено отказаться от исполльзования функции isempty
 //Вместо этого смотрим, не на s [0] ли указывает adres_nulevogo_elementa
 if (adres_nulevogo_elementa!= a) {
 
  //Допустим, что стек не пуст. А это значит, что он либо полон, либо нет. Если стек полон, тогда
  //вот что делаем
  if (adres_nulevogo_elementa== 0) {
   adres_nulevogo_elementa= &a[SIZE-1] ;
  }
 
  //Ну, а если не полон то вот что. А если полон, то простая деинкременация не пойдёт, т. к. 
  //adres_nulevogo_elementa будет содержать 0, потому такие заморочки (см. инструкцию выше)
  else {
   adres_nulevogo_elementa--;
  }
  getchar ();
  return adres_nulevogo_elementa->el;
 }
 
 else {
  cerr<<"Stack is empty! What to pop...!";
 }
 return 0;
}
 
int main(){
stack s;
 
//Вот перво-наперво проинициализируем эту переменную
adres_nulevogo_elementa= s.vozvr(); 
 
int ch=1,num;
while(ch!=0) {
 
        cout<<"Stack Operations Mani Menu\n1.Push\n2.Pop\n3.IsEmpty\n4.IsFull\n0.Exit\n";
        cin>>ch;
 
        switch(ch) {
 
        case 0:
                exit(1); //Normal Termination of Program
        case 1:
                cout<<"Enter the number to push"<<endl;
                cin>>num;
                s.push(num);
                break;
        case 2:
                cout<<"Number popped from the stack is: "<<s.pop()<<endl;
                break;
        case 3:
                (adres_nulevogo_elementa== s.vozvr())?(cout<<"Stack is empty."):(cout<<"Stack is not empty.");
                break;
        case 4:
                (!adres_nulevogo_elementa->pel)?(cout<<"Stack is full."):(cout<<"Stack is not full.");
                break;
        default:
                cout<<"Illegal Option.Please try again";
        }
}//end of while
getch();
 return 0;
}
Добавлено через 20 минут
Тему можно закрыть/удалить, решение нашел сам, помогу таким же как я.
http://www.cyberforum.ru/cpp-beginne...tml#post416162
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru