-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstack.h
114 lines (94 loc) · 4.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
//
// Created by shodan on 1/8/17.
//
#ifndef STECK_STACK_H
#define STECK_STACK_H
#include <cassert> // для assert
#include <iostream>
#include <iomanip> // для setw
using namespace std;
template<typename T>
class Stack {
private:
T *stackPtr; // указатель на стек
const int size; // максимальное количество элементов в стеке
int top; // номер текущего элемента стека
public:
Stack(int = 10); // по умолчанию размер стека равен 10 элементам
Stack(const Stack<T> &); // конструктор копирования
~Stack(); // деструктор
inline void push(const T &); // поместить элемент в вершину стека
inline T pop(); // удалить элемент из вершины стека и вернуть его
inline void printStack(); // вывод стека на экран
inline const T &Peek(int) const; // n-й элемент от вершины стека
inline int getStackSize() const; // получить размер стека
inline T *getPtr() const; // получить указатель на стек
inline int getTop() const; // получить номер текущего элемента в стеке
};
// реализация методов шаблона класса STack
// конструктор Стека
template<typename T>
Stack<T>::Stack(int maxSize) :
size(maxSize) // инициализация константы
{
stackPtr = new T[size]; // выделить память под стек
top = 0; // инициализируем текущий элемент нулем;
}
// конструктор копирования
template<typename T>
Stack<T>::Stack(const Stack<T> &otherStack) :
size(otherStack.getStackSize()) // инициализация константы
{
stackPtr = new T[size]; // выделить память под новый стек
top = otherStack.getTop();
for (int ix = 0; ix < top; ix++)
stackPtr[ix] = otherStack.getPtr()[ix];
}
// функция деструктора Стека
template<typename T>
Stack<T>::~Stack() {
delete[] stackPtr; // удаляем стек
}
// функция добавления элемента в стек
template<typename T>
inline void Stack<T>::push(const T &value) {
// проверяем размер стека
assert(top < size); // номер текущего элемента должен быть меньше размера стека
stackPtr[top++] = value; // помещаем элемент в стек
}
// функция удаления элемента из стека
template<typename T>
inline T Stack<T>::pop() {
// проверяем размер стека
assert(top > 0); // номер текущего элемента должен быть больше 0
stackPtr[--top]; // удаляем элемент из стека
}
// функция возвращает n-й элемент от вершины стека
template<class T>
inline const T &Stack<T>::Peek(int nom) const {
//
assert(nom <= top);
return stackPtr[top - nom]; // вернуть n-й элемент стека
}
// вывод стека на экран
template<typename T>
inline void Stack<T>::printStack() {
for (int ix = top - 1; ix >= 0; ix--)
cout << "|" << setw(4) << stackPtr[ix] << endl;
}
// вернуть размер стека
template<typename T>
inline int Stack<T>::getStackSize() const {
return size;
}
// вернуть указатель на стек (для конструктора копирования)
template<typename T>
inline T *Stack<T>::getPtr() const {
return stackPtr;
}
// вернуть размер стека
template<typename T>
inline int Stack<T>::getTop() const {
return top;
}
#endif //STECK_STACK_H