fork(2) download
  1. #include <iostream>
  2.  
  3. template<typename T, std::size_t Size = 64>
  4. class stack {
  5. T data[Size];
  6. std::size_t elements_count = 0;
  7. public:
  8. template<typename... Ty>
  9. stack(Ty... tys):
  10. data{tys...},
  11. elements_count{sizeof...(Ty)} {}
  12.  
  13. stack() {}
  14.  
  15. bool empty() const {
  16. return elements_count == 0;
  17. }
  18.  
  19. bool full() const {
  20. return elements_count == Size;
  21. }
  22.  
  23. T pop() {
  24. if(empty()) {
  25. throw std::out_of_range("Cannot pop from empty stack");
  26. }
  27. return data[--elements_count];
  28. }
  29.  
  30. void push(T const &value) {
  31. if(full()) {
  32. throw std::out_of_range("Cannot push to full stack");
  33. }
  34. data[elements_count++] = value;
  35. }
  36.  
  37. auto begin() const {
  38. return std::begin(data);
  39. }
  40.  
  41. auto end() const {
  42. return std::begin(data)+elements_count;
  43. }
  44. };
  45.  
  46. int main() {
  47. stack<int, 3> s {1, 2, 3};
  48. s.pop();
  49. s.push(4);
  50.  
  51. for(auto element: s) {
  52. std::cout << element << " ";
  53. }
  54.  
  55. try {
  56. s.push(100);
  57. }catch(...) {
  58. std::cout << "\npushing to full stack is forbidden";
  59. }
  60.  
  61. s.pop(); s.pop(); s.pop();
  62.  
  63. try {
  64. s.pop();
  65. }catch(...) {
  66. std::cout << "\npopping from empty stack is forbidden";
  67. }
  68. return 0;
  69. }
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
1 2 4 
pushing to full stack is forbidden
popping from empty stack is forbidden