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

Написать стек на базе массива, и на базе связного списка - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сохранение в текстовый файл http://www.cyberforum.ru/cpp-beginners/thread52659.html
Есть вот такой примерный код проги, которая должна считать значение ф-ции с определённым шагом(не меньше 10 значений), и считать её в конкретной задаваемой точке. Вопрос: как сделать чтобы эта...
C++ Задача с символом строк Помогите решить: сколько в символьной строке слов, имеющие в середине слова средний символ(символ который находится в середине слова) http://www.cyberforum.ru/cpp-beginners/thread52634.html
с чего начать C++
я сейчас обучаюсь в одном заведении (чтото вроди кружка) C#-у. нам там пока дают базу но ее я вроди как и знаю. учитель видит что я ничего нового не узнаю предложил мне перейти на С, но там уже...
C++ используя рекурсивную реализацию функции для чисел фибоначчи доказать Fn + 1Fn - 1 - Fn2 = (- 1)n (Кассини))
используя рекурсивную реализацию функции для чисел фибоначчи доказать Fn + 1Fn - 1 - Fn2 = (- 1)n (Кассини)) #include "stdafx.h" #include "stdio.h" #include "conio.h" int F(int n) {...
C++ Помогите с рекурсией http://www.cyberforum.ru/cpp-beginners/thread52592.html
Добрый день уважаемые! Помогите пожалуйста с этой задачкой. А точнее выполнить ее с помощью рекурсии http://pic.ipicture.ru/uploads/090925/jXEI0Tp0Dq.jpg Заранее спасибо! :) Добавлено через 46...
C++ Написать библиотеку функций для работы с одномерным целочисленным массивом 1 Написати бiблiотеку функцiй для роботи з одновимiрним цiлочисельним масивом а)Функцii для iнiцiалiзацii масиву випадковими числами з дiапазону (0...50) б) Функцiя для виводу масиву на... подробнее

Показать сообщение отдельно
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
26.09.2009, 23:04
Друзья!
Вот эта штука реализует задачу с помощью связного списка.
За основу взял код Sekt.
Из него я убрал две функции:
int isempty();
int isfull();

И добавил одну vozvr
Остальные комментарии в тексте.
Для лёгкости тестирования SIZE== 3 (это в макросе)
Буду благодарен замечаниям, т. к. я только учусь.

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
144
145
146
147
148
149
150
151
152
153
# 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;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru