fork download
  1. #include <iostream>
  2.  
  3.  
  4.  
  5. template<typename T>
  6. class Stack {
  7. private:
  8. T* arr;
  9. size_t cnt;
  10. size_t size;
  11. public:
  12.  
  13. Stack(void):arr(NULL), cnt(0), size(16){}
  14. Stack(const Stack& s):arr(NULL), cnt(0), size(16){
  15. this->copy(s);
  16. }
  17. ~Stack(){
  18. this->clear();
  19. }
  20.  
  21. public:
  22.  
  23. bool push(const T& val){
  24. if(this->resize(1)){
  25. arr[cnt++] = val;
  26. return true;
  27. }
  28. return false;
  29. }
  30.  
  31. void copy(const Stack& s){
  32. if((this != &s) && !s.isEmpty()){
  33. this->clear();
  34. if(this->resize(s.cnt)){
  35. const T* e = s.arr + s.cnt;
  36. for(const T* p = s.arr; p != e; ++p)
  37. this->push(*p);
  38. }
  39. }
  40. }
  41.  
  42. void pop(void){
  43. if((cnt > 0) && (--cnt == 0))
  44. this->clear();
  45. }
  46.  
  47. void clear(void){
  48. if(arr != NULL)
  49. delete[] arr;
  50. arr = NULL;
  51. cnt = 0;
  52. size = 16;
  53. }
  54.  
  55. T& top(void){ return arr[cnt - 1]; }
  56. T& top(void) const { return arr[cnt - 1]; }
  57.  
  58. bool isEmpty(void) const {
  59. return (arr == NULL);
  60. }
  61.  
  62. size_t getSize(void) const {
  63. return cnt;
  64. }
  65.  
  66. Stack& operator = (const Stack& s){
  67. this->copy(s);
  68. return *this;
  69. }
  70.  
  71. public:
  72.  
  73. int resize(size_t N){
  74. if(arr == NULL){
  75. if(N > size)
  76. size = N + 1;
  77. arr = new (std::nothrow) T[size];
  78. if(arr == NULL)
  79. return 0;
  80. } else if((cnt + N) > size){
  81. T* ptr = new (std::nothrow) T[cnt + N + size];
  82. if(ptr == NULL)
  83. return 0;
  84. for(size_t i = 0; i < cnt; ++i)
  85. ptr[i] = arr[i];
  86.  
  87. delete[] arr;
  88. arr = ptr;
  89. size = cnt + N + size;
  90. }
  91. return 1;
  92. }
  93. };
  94.  
  95.  
  96. int main(void) {
  97. Stack<int> s;
  98. for(int i = 0; i < 10; ++i)
  99. s.push(i);
  100.  
  101. while(! s.isEmpty()){
  102. std::cout << s.top() << ' ';
  103. s.pop();
  104. }
  105. return 0;
  106. }
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
9 8 7 6 5 4 3 2 1 0