-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStack.h
139 lines (120 loc) · 5.05 KB
/
Stack.h
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
#pragma once
#include <iostream>
using namespace std;
// Оголошення структури для вузла списку
struct Node
{
int data; // Дані вузла
Node* next; // Вказівник на наступний вузол
Node() { data = 0; next = nullptr; } // Конструктор за замовчуванням
Node(int x) { data = x; next = nullptr; } // Конструктор з параметром
};
// Оголошення класу "Стек"
class Stack
{
public:
Node* Top; // Вказівник на верхній елемент стеку
// Конструктор за замовчуванням
Stack()
{
Top = nullptr; // Початкове значення вказівника - nullptr (пустий стек)
}
// Деструктор
~Stack()
{
Node* temp = Top; // Встановлення початкового вказівника на верхній елемент
// Поки є елементи в стеці
while (Top)
{
temp = Top; // Зберігаємо поточний вузол
Top = Top->next; // Переходимо до наступного вузла
delete temp; // Видаляємо попередній вузол
}
}
void push(int x);
void push(Stack& p);
void pop();
void view();
char top();
bool empty();
};
// Реалізація методів класу "Стек"
// Додавання елементу у стек
void Stack::push(int x)
{
Node* n_new = new Node(x); // Створення нового вузла з переданим значенням
n_new->next = Top; // Новий вузол вказує на попередній верхній елемент
Top = n_new; // Початковий вказівник тепер вказує на новий вузол
}
// Видалення верхнього елементу зі стеку
void Stack::pop()
{
// Якщо стек пустий
if (!Top)
{
cout << "nothing to delete" << endl; // Вивід повідомлення про порожній стек
}
else
{
Node* temp = Top; // Зберігання початкового вказівника на верхній елемент
Top = Top->next; // Переходимо до наступного вузла (видаляємо верхній елемент)
delete temp; // Видаляємо попередній верхній елемент
}
}
// Виведення всіх елементів стеку
void Stack::view()
{
// Якщо стек пустий
if (!Top)
{
cout << "stack is empty" << endl; // Вивід повідомлення про порожній стек
}
else
{
const Node* temp = Top; // Встановлення початкового вказівника на верхній елемент
// Поки є елементи в стеці
while (temp)
{
cout << temp->data << " "; // Виведення даних поточного вузла
temp = temp->next; // Перехід до наступного вузла
}
cout << endl;
}
}
// Повернення значення верхнього елементу стеку
char Stack::top()
{
return Top->data; // Повернення значення верхнього елементу
}
// Перевірка на пустоту стеку
bool Stack::empty()
{
return Top == nullptr; // Повернення true, якщо стек порожній, і false - в іншому випадку
}
// Додавання стеку p у поточний стек
void Stack::push(Stack& p)
{
// Якщо стек p не пустий і поточний стек не пустий
if (!(p.empty() && empty()))
{
Node* temp = p.Top; // Встановлення початкового вказівника на верхній елемент стеку p
Node* pTop = p.Top; // Зберігання початкового вказівника на верхній елемент стеку p
// Поки є елементи в стеці p
while (temp)
{
// Якщо є наступний елемент
if (temp->next)
{
temp = pTop; // Встановлення початкового вказівника на верхній елемент стеку p
pTop = pTop->next; // Переходимо до наступного вузла стеку p
}
else
{
temp->next = Top; // Останній елемент стеку p вказує на верхній елемент поточного стеку
Top = p.Top; // Початковий вказівник поточного стеку вказує на верхній елемент стеку p
break; // Вихід з циклу
}
}
p.Top = nullptr; // Звільнення пам'яті, оскільки всі елементи стеку p тепер в поточному стеці
}
}