Необходимо реализовать динамическую структуру данных – «Хранилище объектов». Это бинарное дерево, каждый элемент которого стек(в стеке структуры фигур). При этом в стеке должно быть не более 5 элеметов. Не работает добавление в контейнер. Что с ним не так? И как реализовать удаление фигур по площади, меньше заданной.
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #include <memory>
#include <cstring>
#include "btree.h"
#include "stack.h"
#include "criteria.h"
template <class T>
class Container
{
public:
void add(const std::shared_ptr<T>& item);
void erase(const Criteria<T>& criteria);
//void print() const;
template <class K>
friend std::ostream& operator << (std::ostream& os, const Container<K>& container);
private:
Btree<Stack<T>> m_container;
}; |
|
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
| template <class T>
void Container<T>::add(const std::shared_ptr<T>& item)
{
auto lastContIt = m_container.begin();
if (lastContIt == m_container.end())
m_container.bstInsert(std::make_shared<Stack<T>>());
lastContIt = m_container.begin();
while (lastContIt.getItem()->GetNext() != nullptr)
++lastContIt;
if ((*lastContIt)->size() == 5)
{
m_container.bstInsert(std::make_shared<Stack<T>>());
++lastContIt;
}
(*lastContIt)->Push(item);
for (unsigned int i = (*lastContIt)->size() - 1; i > 0; --i)
{
auto lastElemIt = (*lastContIt)->get(i);
auto preLastElemIt = (*lastContIt)->get(i - 1);
if (strcmp(preLastElemIt->getName(), lastElemIt->getName()) <= 0)
break;
preLastElemIt.getItem()->swap(*lastElemIt.getItem());
}
}
template <class T>
void Container<T>::erase(const Criteria<T>& criteria)
{
}
template <class K>
std::ostream& operator << (std::ostream& os, const Container<K>& container)
{
if (container.m_container.size() == 0)
{
os << "================" << std::endl;
os << "Container is empty" << std::endl;
}
else
{
unsigned int containerCnt1 = 1;
for (auto subCont : container.m_container)
{
unsigned int containerCnt2 = 1;
os << "================" << std::endl;
os << "Container #" << (containerCnt1++) << ":" << std::endl;
for (auto subItem : *subCont)
{
os << "================" << std::endl;
os << "Item #" << (containerCnt2++) << ":" << std::endl;
subItem->print();
os << "Area: " << subItem->area() << std::endl;
}
}
}
return os;
} |
|
Дерево стек и итератор.
Кликните здесь для просмотра всего текста
Дерево
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
| #include "iterator.h"
template <class T>
class Btree
{
public:
Btree();
void bstInsert(const std::shared_ptr<T>& figure);
void bstRemove(const std::shared_ptr<T>& figure);
void Insert(const std::shared_ptr<T>& figure);
Iterator<BTreeItem<T>, T> begin() const;
Iterator<BTreeItem<T>, T> end() const;
unsigned int size() const;
template <class B>
friend std::ostream& operator << (std::ostream& os, const Btree<B>& Btree);
template <class B>
void print1(const Btree<B>& btree);
private:
std::shared_ptr<BTreeItem<T>> m_root;
unsigned int m_size;
}; |
|
Элемент дерева. Для обхода дерева есть еще один отдельный стек TStack
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
| template <class T>
class BTreeItem
{
public:
BTreeItem(const std::shared_ptr<T>& figure);
template <class B>
friend std::ostream& operator << (std::ostream& os, const BTreeItem<B>& obj);
bool operator == (const BTreeItem<T>& other) const;
void setLeft(std::shared_ptr<BTreeItem<T>> left);
void setRight(std::shared_ptr<BTreeItem<T>> right);
std::shared_ptr<BTreeItem<T>> getLeft();
std::shared_ptr<BTreeItem<T>> getRight();
std::shared_ptr<T> getItem() const;
std::shared_ptr<BTreeItem<T>> getNext();
shared_ptr<BTreeItem<T>> GetNext();
shared_ptr<BTreeItem<T>> GoFarLeft(shared_ptr<BTreeItem<T>> current);
private:
std::shared_ptr<T> m_figure;
std::shared_ptr<BTreeItem<T>> m_left;
std::shared_ptr<BTreeItem<T>> m_right;
static TStack<shared_ptr<BTreeItem<T>>> stackOfBTreeItem;
};
template <typename T> TStack<shared_ptr<BTreeItem<T>>> BTreeItem<T>::stackOfBTreeItem;///// |
|
Основной стек
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
| template <class T> class Stack
{
public:
Stack();
virtual ~Stack();
void Push(const std::shared_ptr<T>& item);
std::shared_ptr<T> Pop();
unsigned int size() const;
bool empty();
Iterator<StackItem<T>, T> get(unsigned int index) const;
Iterator<StackItem<T>, T> begin() const;
Iterator<StackItem<T>, T> end() const;
template <class K>
friend std::ostream& operator << (std::ostream& os, const Stack<K>& stack);
private:
std::shared_ptr<StackItem<T>> head;
unsigned int m_size;
}; |
|
Элемент стека
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| template <class T> class StackItem
{
public:
StackItem(const std::shared_ptr<T>& item);
std::shared_ptr<StackItem<T>> SetNext(std::shared_ptr<StackItem>& m_next);
void swap(StackItem<T>& other);
std::shared_ptr<StackItem<T>> getNext();
std::shared_ptr<T> getItem() const;
private:
std::shared_ptr<T> m_item;
std::shared_ptr<StackItem<T>> m_next;
}; |
|