Приведено следующее определение:
class Element {
friend class Stack; Element* prev;
int data1,data2;
public:
Element(int d1=0,int d2=0,
Element* pr=NULL)
:data1(d1),data2(d2),prev(pr){}
void Show()
{ cout<<data1<<' '<<data2<<endl;}
};
Реализация класс стека, в котором объекты хранятся
(элементы-это пары целых чисел):
Поля:
указатель будет содержать на вершине (элемент * типа):
Методы и глобальные функции.
конструктор, который создает пустой больнице,
рабочая конструктор,
деструкторы,
функция под названием push, которая добавлена в хранилище-
рисует новый элемент,
pop имя функция, которая удаляет содержат
Пиковый Элемент,
getd1 имя функция, которая возвращает резервное копирование-
первое целое число вершины Наки,
getd2 функция, которая возвращает резервное копирование-
второе целое число вершины Наки,
оператор= (приписать действие),
operator==, operator!= (два Хранителя-
функции меммации),
функция вывода на хранение, начиная с вершины
вывод содержимого:
C/C++
C++ класс Реализация класс стека,
Вот вам годный стек...
template<typename Type>
class Stack {
public:
Stack(Stack&&) = delete;
Stack& operator=(Stack&&) = delete;
Stack() : n(0U), m(8U), stack(new Type[m]) {}
Stack(const Stack& st) : n(st.n), m(st.m), stack(new Type[st.m]) {
for (auto i = 0U; i < n; ++i) stack[i] = st.stack[i];
}
~Stack() {
if (stack != nullptr) {
delete[] stack;
stack = nullptr;
}
}
Stack& operator=(const Stack& st) {
if (this != &st) {
delete[] this->stack;
this->m = st.m;
this->n = st.n;
this->stack = new Type[this->m];
for (auto i = 0U; i < this->n; ++i) this->stack[i] = st.stack[i];
}
return *this;
}
size_t size()const {
return n;
}
size_t capacity()const {
return m;
}
bool empty()const {
return n == 0U;
}
void push(const Type& x) {
if (n == m) {
m <<= 1;
auto tmp = new Type[m];
for (auto i = 0U; i < n; ++i) tmp[i] = stack[i];
delete[] stack;
stack = new Type[m];
for (auto i = 0U; i < n; ++i) stack[i] = tmp[i];
delete[] tmp;
}
stack[n] = x;
++n;
}
void pop() {
--n;
}
Type& top() {
return stack[n - 1U];
}
private:
size_t n;
size_t m;
Type* stack;
friend bool operator<(const Stack<Type>& a, const Stack<Type>& b) {
auto n = a.size() < b.size() ? a.size() : b.size();
for (auto i = 0U; i < n; ++i) if (a.stack[i] < b.stack[i]) return true;
return a.size() < b.size();
}
friend bool operator==(const Stack<Type>& a, const Stack<Type>& b) {
auto n = a.size() < b.size() ? a.size() : b.size();
for (auto i = 0U; i < n; ++i) if (a.stack[i] != b.stack[i]) return false;
return a.size() == b.size();
}
friend bool operator<=(const Stack<Type>& a, const Stack<Type>& b) {
return a < b || a == b;
}
friend bool operator!=(const Stack<Type>& a, const Stack<Type>& b) {
return !(a == b);
}
friend bool operator>=(const Stack<Type>& a, const Stack<Type>& b) {
return !(a < b);
}
friend bool operator>(const Stack<Type>& a, const Stack<Type>& b) {
return !(a <= b);
}
};
P.S. А со своими целыми числами вершин Наки вы, я надеюсь, в пустой больнице разберётесь.
template<typename Type>
class Stack {
public:
Stack(Stack&&) = delete;
Stack& operator=(Stack&&) = delete;
Stack() : n(0U), m(8U), stack(new Type[m]) {}
Stack(const Stack& st) : n(st.n), m(st.m), stack(new Type[st.m]) {
for (auto i = 0U; i < n; ++i) stack[i] = st.stack[i];
}
~Stack() {
if (stack != nullptr) {
delete[] stack;
stack = nullptr;
}
}
Stack& operator=(const Stack& st) {
if (this != &st) {
delete[] this->stack;
this->m = st.m;
this->n = st.n;
this->stack = new Type[this->m];
for (auto i = 0U; i < this->n; ++i) this->stack[i] = st.stack[i];
}
return *this;
}
size_t size()const {
return n;
}
size_t capacity()const {
return m;
}
bool empty()const {
return n == 0U;
}
void push(const Type& x) {
if (n == m) {
m <<= 1;
auto tmp = new Type[m];
for (auto i = 0U; i < n; ++i) tmp[i] = stack[i];
delete[] stack;
stack = new Type[m];
for (auto i = 0U; i < n; ++i) stack[i] = tmp[i];
delete[] tmp;
}
stack[n] = x;
++n;
}
void pop() {
--n;
}
Type& top() {
return stack[n - 1U];
}
private:
size_t n;
size_t m;
Type* stack;
friend bool operator<(const Stack<Type>& a, const Stack<Type>& b) {
auto n = a.size() < b.size() ? a.size() : b.size();
for (auto i = 0U; i < n; ++i) if (a.stack[i] < b.stack[i]) return true;
return a.size() < b.size();
}
friend bool operator==(const Stack<Type>& a, const Stack<Type>& b) {
auto n = a.size() < b.size() ? a.size() : b.size();
for (auto i = 0U; i < n; ++i) if (a.stack[i] != b.stack[i]) return false;
return a.size() == b.size();
}
friend bool operator<=(const Stack<Type>& a, const Stack<Type>& b) {
return a < b || a == b;
}
friend bool operator!=(const Stack<Type>& a, const Stack<Type>& b) {
return !(a == b);
}
friend bool operator>=(const Stack<Type>& a, const Stack<Type>& b) {
return !(a < b);
}
friend bool operator>(const Stack<Type>& a, const Stack<Type>& b) {
return !(a <= b);
}
};
P.S. А со своими целыми числами вершин Наки вы, я надеюсь, в пустой больнице разберётесь.
Похожие вопросы
- C++, помогите с классами
- Программа на с++ с использованием стека
- Имя массива после инициализации принимает адрес в стеке, который указывает на адрес в куче? (Си)
- C++: где vector хранит внутренний массив? В стеке или в куче?
- Написать программу на C++.Создать класс vector3d, задаваемый тройкой координат. Создать конструктор...
- Класс Poll и класс Variant (тема инкапсуляция) C++
- Помогите понять отношения между классами / C/C++
- Лёгкое задание с классами C++
- Передача в метод класса указателя на функцию C++
- Как в C++ продолжить классы разные сгруппировано в файлах .h и .cpp, при этом не переопределяя классы эти?