This repository was archived by the owner on Jan 8, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTStack.cpp
More file actions
80 lines (78 loc) · 2.15 KB
/
TStack.cpp
File metadata and controls
80 lines (78 loc) · 2.15 KB
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
#include "TStack.h"
#include <cstring>
template<class T>
/// <summary>
/// Конструктор. Устанавливает начальный размер в 10. Изначальный индекс в -1. Создаёт массив на 10 чисел.
/// </summary>
TStack<T>::TStack()
{
this->size = 10;
current_index = -1;
items = new T[size];
}
template<class T>
/// <summary>
/// Деструктор, высвобождает память, занятую массивом
/// </summary>
TStack<T>::~TStack()
{
delete[] items;
}
/// <summary>
/// Если в массиве достаточно места - просто увеличивает текущий индекс и добавляет новый элемент в него.
/// <para/> Иначе создаётся новый массив, удвоенной вместимости, туда копируется старый массив и уже потом увеличивается текущий индекс и добюавляется новый элемент
/// <para/> Память под старый массив высвобождается.
/// </summary>
/// <param name="t">Элемент для вставки</param>
template<class T>
void TStack<T>::push(T t)
{
if (size == (current_index + 1))
{
size *= 2;
T* old_array = items;
T* new_array = new T[size];
memcpy(new_array, old_array, (current_index + 1) * sizeof(T));
items = new_array;
delete[] old_array;
}
items[++current_index] = t;
}
/// <summary>
/// Получает элемент по текущему индексу, затем уменьшает этот индекс на 1
/// </summary>
/// <returns>элемент по текущему индексу</returns>
template<class T>
T TStack<T>::pop()
{
return items[current_index--];
}
template<class T>
/// <summary>
/// Если текущий индекс < 0 - устанавливает res_marker в false и возвращает NULL
/// <para/> Иначе устанавливает res_marker в true, получает элемент по текущему индексу, затем уменьшает этот индекс на 1
/// </summary>
/// <returns>элемент по текущему индексу</returns>
T TStack<T>::try_pop(bool* res_marker)
{
*res_marker = (current_index >= 0);
return (*res_marker) ? pop() : NULL;
}
/// <summary>
/// Получает элемент по текущему индексу, не уменьшая текущий индекс
/// </summary>
/// <returns>элемент по текущему индексу</returns>
template<class T>
T TStack<T>::peek()
{
return items[current_index];
}
/// <summary>
/// Возвращает количество хранимых элементов, а не вместимость.
/// </summary>
/// <returns>количество элементов в стеке</returns>
template<class T>
int TStack<T>::count()
{
return current_index + 1;
}