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

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

Восстановить пароль Регистрация
 
Basisd
2 / 2 / 0
Регистрация: 09.12.2010
Сообщений: 39
11.01.2012, 05:51     Стек из списка #1
Здравствуйте, обращаюсь за помощью не в первый раз, всегда помогали, отдельное спасибо. Задача такая. Реализовать стек с помощью списка и осуществить добавление элементов, ну и просмотр. Я лентяй, решил воспользоваться чужим кодом. Напишите пожалуйста функцию, осуществляющую просмотр добавленных элементов, желательно с комментариями, хочу понять это всё, чтобы не было лишних вопросов в следующий раз, спасибо.

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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greeezz
11.01.2012, 06:11
  #2

Не по теме:

Цитата Сообщение от Basisd Посмотреть сообщение
Я лентяй, решил воспользоваться чужим кодом.
ну это ж надо а уже и не скрывают!
з.ы. а преподаватель то знает ?

lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.01.2012, 09:26     Стек из списка #3
Цитата Сообщение от Basisd Посмотреть сообщение
Я лентяй, решил воспользоваться чужим кодом.
Могу заодно "обрадовать" -- этот код редкостная чушь.

Добавлено через 15 минут
Вот что-то поближе к правильному варианту.
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
#include <iostream>
#include <stdexcept>
 
struct Node {
  Node *next;
  int data;
  Node(Node *next_, int data_) : next(next_), data(data_) {}
};
 
class Stack {
 public:
  Stack() : top_(NULL) {}
  ~Stack() {
    while (!isEmpty()) pop(); // очистка стека
  }
  bool isEmpty() const { return top_ == NULL; }
  void push(int value) {
    Node *node = new Node(top_, value);
    top_ = node;
  } 
  int pop() {
    if (isEmpty())
      throw std::underflow_error("Stack underflow.");
    int result = top_->data;
    Node *nextNode = top_->next;
    delete top_;
    top_ = nextNode;
    return result;
  }
 private:
  Stack(const Stack&); // запрет копирования конструктором
  Stack &operator=(const Stack&); // запрет присваивания
  Node *top_; // вершина стека
};
 
// содержимое стека распечатывается рекурсивно
std::ostream &operator<<(std::ostream &stream, Stack &stack) {
  if (stack.isEmpty()) return stream; // если стек пуст, возвращается stream
  int value = stack.pop(); // число из вершины стека
  std::cout << value << " " << stack; // число помещается в поток и рекусривно
                                      // вызывается эта же функция
  stack.push(value); // число возвращается в стек
  return stream; // возвращается поток
}
 
int main(int argc, char *argv[]) {
  Stack a;
  for (int i = 0; i < 10; ++i)
    a.push(i);
  std::cout << a << std::endl;
}
Минич
 Аватар для Минич
66 / 66 / 3
Регистрация: 26.11.2010
Сообщений: 123
11.01.2012, 09:44     Стек из списка #4
Цитата Сообщение от lemegeton Посмотреть сообщение
Вот что-то поближе к правильному варианту.
И что работает?! У меня подозрения что нет! Т.к. при просмотре стека идет алгоритм, в котором значение достается из стека, выводится и обратно запихивается в вершину сетка!
Мое предложение написать функцию, в которую стек передается по указателю (не по ссылке), и пройтись по стеку используя указатель. В таком случае можно не нужно будет беспокоиться об указателе на вершину стека!
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.01.2012, 09:52     Стек из списка #5
Цитата Сообщение от Минич Посмотреть сообщение
И что работает?!
Работает.

Цитата Сообщение от Минич Посмотреть сообщение
У меня подозрения что нет! Т.к. при просмотре стека идет алгоритм, в котором значение достается из стека, выводится и обратно запихивается в вершину сетка!
И как при этом нарушается содержимое стека? Вряд ли имеется в виду потокобезопасность.

Цитата Сообщение от Минич Посмотреть сообщение
Мое предложение написать функцию, в которую стек передается по указателю (не по ссылке), и пройтись по стеку используя указатель. В таком случае можно не нужно будет беспокоиться об указателе на вершину стека!
Тогда её нужно будет добавлять в класс или friend'ом.
Минич
 Аватар для Минич
66 / 66 / 3
Регистрация: 26.11.2010
Сообщений: 123
11.01.2012, 10:24     Стек из списка #6
Приношу свои извинения, был не прав! Не заметил рекурсию!
Basisd
2 / 2 / 0
Регистрация: 09.12.2010
Сообщений: 39
18.01.2012, 21:15  [ТС]     Стек из списка #7
lemegeton,
C++
1
#include <stdexcept>
это внешняя библиотека, с помощью которой делается стек?

Цитата Сообщение от greeezz Посмотреть сообщение
з.ы. а преподаватель то знает ?
естесственно) правда я очень сообразительный)
Арсенал
144 / 66 / 6
Регистрация: 30.12.2011
Сообщений: 137
18.01.2012, 23:13     Стек из списка #8
Цитата Сообщение от Basisd Посмотреть сообщение
lemegeton,
C++
1
#include <stdexcept>
это внешняя библиотека, с помощью которой делается стек?
Заголовочный файл для обработки исключительных ситуаций
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.01.2012, 08:40     Стек из списка #9
Цитата Сообщение от Basisd Посмотреть сообщение
lemegeton,
Код C++
1
#include <stdexcept>
это внешняя библиотека, с помощью которой делается стек?
Это внешняя библиотека, в которой есть описание ексепшена, использующееся в данной реализации стека. Лень было свой класс для такой фигни писать.
C++
1
std::underflow_error("Stack underflow.");
Basisd
2 / 2 / 0
Регистрация: 09.12.2010
Сообщений: 39
19.01.2012, 11:08  [ТС]     Стек из списка #10
ммм... Ладно, придумаю что-нибудь... мне всё-таки класс нужен, условия такие
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.01.2012, 11:49     Стек из списка #11
Цитата Сообщение от Basisd Посмотреть сообщение
ммм... Ладно, придумаю что-нибудь... мне всё-таки класс нужен, условия такие
Происходящее в написанном мною коде ускользает от вашего понимания? Что же такое, по-вашему, в моем коде Stack, если не класс?

Цитата Сообщение от lemegeton Посмотреть сообщение
class Stack {
Ваш, К.О.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2012, 12:34     Стек из списка
Еще ссылки по теме:

Программа должна обеспечивать:хранение данных в информационной системе в виде односвязного списка (стек и очередь) C++
Создать базовый класс список. Реализовать на базе списка стек и очередь с виртуальными функциями вставки и вытаскивания C++
Напишите класс «Стек» для целочисленных данных на основе односвязного списка C++

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

Или воспользуйтесь поиском по форуму:
Basisd
2 / 2 / 0
Регистрация: 09.12.2010
Сообщений: 39
19.01.2012, 12:34  [ТС]     Стек из списка #12
Цитата Сообщение от lemegeton Посмотреть сообщение
Это внешняя библиотека, в которой есть описание ексепшена, использующееся в данной реализации стека. Лень было свой класс для такой фигни писать.
Я спросонья не так понял это сообщение, простите) Спасибо за доходчивое объяснение))
Yandex
Объявления
19.01.2012, 12:34     Стек из списка
Ответ Создать тему
Опции темы

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