fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. #ifndef STACK_H
  5. #define STACK_H
  6.  
  7. #include <cassert> // для assert
  8. #include <iostream>
  9. #include <stdio.h>
  10. #include <iomanip> // для setw
  11.  
  12. template <typename T>
  13. class Stack
  14. {
  15. private:
  16. T *stackPtr; // указатель на стек
  17. int size; // максимальное количество элементов в стеке
  18. int top; // номер текущего элемента стека
  19. public:
  20. Stack(int = 10); // по умолчанию размер стека равен 10 элементам
  21. Stack( Stack<T> &); // конструктор копирования
  22. ~Stack(); // деструктор
  23.  
  24. // поместить элемент в вершину стека
  25. // Stack<T> operator=(Stack<T>& a);
  26. inline void push( int & value);
  27. inline void push(Stack<int> &value);
  28. inline T pop(); // удалить элемент из вершины стека и вернуть его
  29. inline void printStack(); // вывод стека на экран
  30. inline T &Peek(int ) ; // n-й элемент от вершины стека
  31. inline int getStackSize() ; // получить размер стека
  32. inline T *getPtr() ; // получить указатель на стек
  33. inline int& getTop() ; // получить номер текущего элемента в стеке
  34. };
  35.  
  36. // реализация методов шаблона класса STack
  37.  
  38. // конструктор Стека
  39. template <typename T>
  40. Stack<T>::Stack(int maxSize) :
  41. size(maxSize) // инициализация константы
  42. {
  43. stackPtr = new T[size]; // выделить память под стек
  44. printf("consctructor(int) %p\n",(void*)stackPtr );
  45. top = 0; // инициализируем текущий элемент нулем;
  46. }
  47.  
  48. // конструктор копирования
  49. template <typename T>
  50. Stack<T>::Stack( Stack<T> & otherStack) :
  51. size(otherStack.getStackSize()) // инициализация константы
  52. {
  53. stackPtr = new T[size]; // выделить память под новый стек
  54. printf("consctructor(stack) %p\n",(void*)stackPtr );
  55. top = otherStack.getTop();
  56.  
  57. for(int ix = 0; ix < top; ix++)
  58. stackPtr[ix] = otherStack.getPtr()[ix];
  59. }
  60.  
  61. // функция деструктора Стека
  62. template <typename T>
  63. Stack<T>::~Stack()
  64. {
  65. printf("desctructor %p\n",(void*)stackPtr );
  66. delete [] stackPtr; // удаляем стек
  67. }
  68.  
  69. // функция добавления элемента в стек
  70. /*
  71. template <typename T>
  72. Stack<T> Stack<T>::operator=(Stack<T>& a)
  73. {
  74.   *this(a);
  75. return *this;
  76. }
  77. */
  78. template <typename T>
  79. inline void Stack<T>::push( int & value)
  80. {
  81. // проверяем размер стека
  82. assert(top < size); // номер текущего элемента должен быть меньше размера стека
  83. stackPtr[top++]=value;
  84. // catch(Stack<int> T)
  85. //{top++;
  86. // stackPtr[top](value);
  87. //stackPtr[top] value; // помещаем элемент в стек
  88. // }
  89.  
  90. }
  91. template <typename T>
  92. inline void Stack<T>::push(Stack<int>& value)
  93. {
  94. assert(top < size);
  95. //stackPtr[top++](value);
  96. top++;
  97. stackPtr[top].getTop()=value.getTop();
  98. for(int ix = 0; ix < stackPtr[top].getTop(); ix++)
  99. stackPtr[top].getPtr()[ix] = value.getPtr()[ix];
  100. }
  101. /*
  102. template <typename T>
  103. inline void Stack<T>::push( int & value)
  104. {
  105.   // проверяем размер стека
  106.   assert(top < size); // номер текущего элемента должен быть меньше размера стека
  107.  
  108.   stackPtr[top++]=value; // помещаем элемент в стек
  109. }
  110. */
  111.  
  112. // функция удаления элемента из стека
  113. template <typename T>
  114. inline T Stack<T>::pop()
  115. {
  116. // проверяем размер стека
  117. assert(top > 0); // номер текущего элемента должен быть больше 0
  118.  
  119. delete stackPtr[--top]; // удаляем элемент из стека
  120. }
  121.  
  122. // функция возвращает n-й элемент от вершины стека
  123. template <class T>
  124. inline T &Stack<T>::Peek(int nom)
  125. {
  126. assert(nom <= top);
  127.  
  128. return stackPtr[top - nom]; // вернуть n-й элемент стека
  129. }
  130.  
  131. // вывод стека на экран
  132. template <typename T>
  133. inline void Stack<T>::printStack()
  134. {
  135. for (int ix = top - 1; ix >= 0; ix--)
  136. printf(" %d \n",stackPtr[ix]);//cout << "|" << setw(4) << stackPtr[ix] << endl;
  137. }
  138.  
  139. // вернуть размер стека
  140. template <typename T>
  141. inline int Stack<T>::getStackSize()
  142. {
  143. return size;
  144. }
  145.  
  146. // вернуть указатель на стек (для конструктора копирования)
  147. template <typename T>
  148. inline T *Stack<T>::getPtr()
  149. {
  150. return stackPtr;
  151. }
  152.  
  153. // вернуть размер стека
  154. template <typename T>
  155. inline int& Stack<T>::getTop()
  156. {
  157. return top;
  158. }
  159.  
  160. #endif // STACK_H
  161.  
  162. int main()
  163. {
  164. int ch, ct = 0;
  165.  
  166. Stack<int> a(10), b(10),c(10);
  167. Stack<Stack<int> > d(4);
  168.  
  169. while (ct++ < 10)
  170. {
  171. cin >> ch;
  172. a.push(ch);
  173. ch++; // помещаем элементы в стек
  174. b.push(ch);
  175. ch++;
  176. c.push(ch);
  177. }
  178. //printf("%d ", ct);
  179. d.push(a);
  180. //printf("%d ", ct);
  181. d.push(b);
  182. d.push(c);
  183. d.Peek(2).printStack();
  184. d.Peek(1).printStack();
  185. d.Peek(0).printStack();
  186. //d.~Stack();
  187. // printf("%d ", ct);
  188. return 0;
  189. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
consctructor(int)  0x954fa10
consctructor(int)  0x954fa40
consctructor(int)  0x954fa70
consctructor(int)  0x954fad8
consctructor(int)  0x954fb08
consctructor(int)  0x954fb38
consctructor(int)  0x954fb68
consctructor(int)  0x954faa4
  1434549826 
  1434549824 
  1434549822 
  1434549820 
  1434549818 
  1434549816 
  1434549814 
  1434549812 
  1434549810 
  1434549808 
  1434549827 
  1434549825 
  1434549823 
  1434549821 
  1434549819 
  1434549817 
  1434549815 
  1434549813 
  1434549811 
  1434549809 
  1434549828 
  1434549826 
  1434549824 
  1434549822 
  1434549820 
  1434549818 
  1434549816 
  1434549814 
  1434549812 
  1434549810 
desctructor 0x954faa4
desctructor 0x954fb68
desctructor 0x954fb38
desctructor 0x954fb08
desctructor 0x954fad8
desctructor 0x954fa70
desctructor 0x954fa40
desctructor 0x954fa10