Stack.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #ifndef STACK_H
  2. #define STACK_H
  3. #include "../Exception.h"
  4. template<class T>
  5. class Stack
  6. {
  7. public:
  8. Stack()
  9. {
  10. pos = 0;
  11. capacity = 4;
  12. data = new T[capacity];
  13. }
  14. Stack(const Stack& orig)
  15. {
  16. pos = orig.pos;
  17. capacity = orig.capacity;
  18. data = new T[capacity];
  19. memcpy(data, orig.data, capacity * sizeof(T));
  20. }
  21. Stack& operator=(const Stack& orig)
  22. {
  23. delete[] data;
  24. pos = orig.pos;
  25. capacity = orig.capacity;
  26. data = new T[capacity];
  27. memcpy(data, orig.data, capacity * sizeof(T));
  28. return *this;
  29. }
  30. virtual ~Stack()
  31. {
  32. delete[] data;
  33. }
  34. int getSize()
  35. {
  36. return pos;
  37. }
  38. bool isEmpty()
  39. {
  40. return pos == 0;
  41. }
  42. void push(T t)
  43. {
  44. if(pos >= capacity)
  45. {
  46. int newCapacity = capacity * 2;
  47. T* t = new T[newCapacity];
  48. memcpy(t, data, capacity * sizeof(T));
  49. delete[] data;
  50. data = t;
  51. capacity = newCapacity;
  52. }
  53. data[pos] = t;
  54. pos++;
  55. }
  56. T pop()
  57. {
  58. if(pos == 0)
  59. {
  60. throw Exception("pop on empty stack");
  61. }
  62. return data[--pos];
  63. }
  64. T peek()
  65. {
  66. if(pos == 0)
  67. {
  68. throw Exception("peek on empty stack");
  69. }
  70. return data[pos - 1];
  71. }
  72. private:
  73. int capacity;
  74. int pos;
  75. T* data;
  76. };
  77. #endif