Advertisement
Guest User

Untitled

a guest
Nov 16th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. template< class T>
  4. struct isBigger
  5. {
  6. //дефолтное сравнение
  7. bool operator() (const T& rightElement, const T& leftElement) const
  8. {
  9. return rightElement > leftElement;
  10. }
  11. };
  12.  
  13. template< class T>
  14. bool isbigger(const T& leftElement, const T& rightElement)
  15. {
  16. return leftElement > rightElement;
  17. }
  18.  
  19.  
  20. template <typename T>
  21. class dequeue
  22. {
  23.  
  24. int last_index;// "голова" дека
  25. int first_index;//хвост дека
  26. int size;//размер массива, выделенного под наш дек
  27. int current_size;//текущий размер дека
  28. T* buffer;//массив в динамической памяти, для хранения дека
  29. void increase_size();
  30.  
  31. public:
  32. int get_size();
  33. void push_front(T element);
  34. void push_back(T element);
  35. T show();
  36. //Если нам надо положить элемент, нам ничего не надо возвращать
  37. T pop_back();
  38. T pop_front();
  39. //Если хотим достать, нам не нужны аргументы
  40. //Запретим копирование
  41. dequeue( const dequeue& ) = delete;
  42. void operator=( const dequeue& ) = delete;
  43. ~dequeue()
  44. {
  45. delete[] buffer;
  46. }
  47. dequeue<T>()
  48.  
  49. {
  50. last_index = 0;
  51. first_index = 0;
  52. size = 16;
  53. current_size = 0;
  54. buffer = new T [size];
  55. }
  56. };
  57. template <typename T>
  58. /*Алгоритм работы пушбека и пушфронта
  59. * Проверка на заполненность текущего массива, если полон вызываем функцию увеличения.
  60. * Если мы пока ничего не записали:
  61. * Вначале поставим начало с концом на 0-ой элемент, т.к пока массив пустой(это условие) и запишем в конец элемент.
  62. * Если уже что-то есть:
  63. * Сдвинем хвост на один, если нет выхода за границу нуля,то прибавим размер массива и пойдем с другой стороны.
  64. * в конце увеличим текущий размер дека
  65. * Функция пушфронт работает аналогично.
  66. **/
  67. int dequeue<T>::get_size()
  68. {return current_size;}
  69. template <typename T>
  70. void dequeue<T>::push_back(T element) {
  71. if (current_size == size)
  72. {
  73. increase_size();
  74. }
  75. if (current_size == 0)
  76. {
  77. last_index = first_index = 0;
  78. buffer[last_index] = element;
  79. }
  80. else
  81. {
  82. last_index = (--last_index < 0) ? last_index + size : last_index;
  83. buffer[last_index] = element;
  84. }
  85. current_size++;
  86. }
  87. /*алгоритм работы попбека и попфронта
  88. * вначале проверка на попытку достать элемент из пустого дека
  89. * если он не пустой, то
  90. * Зафиксируем элемент(первый или последний), т.к дальше поменяем индекс
  91. * Если первый,последний индексы выходят за границу(первый в минус, второй в s-1 и дальше),то значит мы дошли до
  92. * конца и надо брать с другой стороны.При попфронте мы идем по массиву влево, уменьшая его при каждой операции.
  93. * В конце уменьшим текущий размер дека и вернем элемент.
  94. * */
  95. template <class T>
  96. T dequeue<T>::pop_front()
  97. {
  98. assert(current_size > 0);
  99. T element = buffer[first_index];
  100. first_index = (--first_index < 0) ? first_index + size : first_index;
  101. current_size--;
  102. return element;
  103. }
  104. /*Алгоритм работы функции увеличения размера
  105. *данная функция вызывается в пуш-ах, когда текущий размер стал равен размеру выделенного массива
  106. * Тогда
  107. * вначале увеличим размер в 2 раза и выделим новый массив в динамической памяти
  108. * Когда будем переносить элементы в новый массив, будем располагать их в правильном порядке, а именно, 0-ой элемент-это
  109. * конец очереди. Реализация такого метода такова:каждый раз, когда мы записали элемент с конца, прибавим к индексу
  110. * последнего единицу. Если мы дошли до конца первого массива(он равен size/2, т.к мы сделали увеличение вначале),
  111. * то продолжжаем с другой стороны(в этом заключается зацикленность буфера).Если же не дошли, то просто движемся вправо.
  112. * После переноса всех элементов поставим хвост очереди на 0-ой элемент, а голову на размер старого массива, минус 1
  113. * (нумерация с нуля).Получили очередь в правильном порядке, с которой продолжим работу.В конце удалим старый массив, и
  114. * поместим указатель старого массива на новый.
  115. * */
  116. template <class T>
  117. void dequeue<T>::increase_size()
  118. {
  119. size *= 2;
  120. T* buffer2 = new T [size];
  121. for (int i = 0; i < current_size; i++)
  122. {
  123. buffer2[i] = buffer[last_index];
  124. last_index = (++last_index == size / 2) ? last_index - size / 2 : last_index;
  125. }
  126. last_index = 0;
  127. first_index = current_size - 1;
  128. delete[] buffer;
  129. buffer = buffer2;
  130. }
  131. template <class T>
  132. T dequeue<T>::pop_back()
  133. {
  134. assert(current_size > 0);
  135. int element = buffer[last_index];
  136. last_index = (++last_index == size) ? last_index - size : last_index;
  137. current_size--;
  138. return element;
  139.  
  140. }
  141.  
  142.  
  143. template <class T>
  144. void dequeue<T>::push_front(T element)
  145. {
  146. if (current_size == size)
  147. {
  148. increase_size();
  149. }
  150. if (current_size == 0)
  151. {
  152. last_index = first_index = 0;
  153. buffer[last_index] = element;
  154. }
  155. else
  156. {
  157. first_index = (++first_index==size) ? first_index - size : first_index;
  158. buffer[first_index] = element;
  159. }
  160. current_size++;
  161. }
  162. template <class T>
  163. T dequeue<T>::show()
  164. {return buffer[first_index];}
  165. template <class T>
  166. void swap(T& a,T& b);
  167. template <class T>
  168. void swap(T& a,T& b)
  169. {
  170. T temp;
  171. temp=a;
  172. a=b;
  173. b=temp;
  174. }
  175.  
  176.  
  177. template <class T>
  178.  
  179.  
  180. struct node
  181. {
  182. node(T element)
  183. {
  184. key = element;
  185. node<T> *left = nullptr;
  186. node<T> *right = nullptr;
  187. }
  188.  
  189. const node &operator = (const node<T> & node1)
  190. {
  191. key = node1.key;
  192. left = node1.left;
  193. right = node1.right;
  194. return *this;
  195. }
  196.  
  197. node()
  198. {
  199. key;
  200. node<T> *left = nullptr;
  201. node<T> *right = nullptr;
  202. }
  203. T key;
  204. node *left;
  205. node *right;
  206. };
  207.  
  208.  
  209. template <class T>
  210. struct tree
  211. {
  212. node<T> * root;
  213. tree()
  214. {root = nullptr;}
  215. void add(T element)
  216. {
  217.  
  218. if (!root)
  219. {
  220. root = new node<T>(element);
  221. return;
  222. }
  223. else
  224. {
  225. //std::cout << root->key;
  226. node<T>* temp = root;
  227. while (temp != nullptr)
  228. {
  229. if ( isbigger (element, temp->key) )
  230. {
  231. //std::cout << 'g';
  232. if (temp->right == nullptr)
  233. {
  234. //std::cout << 'r';
  235. temp->right = new node<T>(element);
  236. return;
  237. }
  238.  
  239.  
  240. temp = temp->right;
  241.  
  242. }
  243. else
  244. {
  245. if (temp->left == nullptr)
  246. {
  247. temp->left = new node<T>(element);
  248. return;
  249. }
  250.  
  251. temp = temp->left;
  252.  
  253. }
  254. }
  255.  
  256. }
  257. }
  258. void preOrder(node<T> * start)
  259. {
  260. if (start == nullptr)
  261. {return;}
  262. dequeue<node<T>* > iterations;
  263. iterations.push_front(start);
  264. while(iterations.get_size() != 0)
  265. {
  266. start = iterations.pop_front();
  267. std::cout<<start->key<<" ";
  268. if ( start->right != nullptr )
  269. {
  270. iterations.push_front(start->right);
  271. }
  272. if (start->left != nullptr )
  273. {
  274. iterations.push_front(start->left);
  275. }
  276. }
  277.  
  278.  
  279.  
  280. }
  281.  
  282. };
  283.  
  284. bool intBigger(const int & a,const int & b)
  285. {return a > b;}
  286.  
  287.  
  288.  
  289.  
  290. int main() {
  291. tree<int> Tree1;
  292. int size;
  293. std::cin>>size;
  294. int *tmpArray = new int [size];
  295. for(int i = 0; i < size; i++)
  296. {
  297. std::cin>>tmpArray[i];
  298. }
  299. for(int i = 0; i < size; i++)
  300. {Tree1.add(tmpArray[i]);}
  301. Tree1.preOrder(Tree1.root);
  302. return 0;
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement