fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const short int link_array_size = 30; //количество элементов в одном звене
  5.  
  6. struct link //звено списка
  7. {
  8. int array [link_array_size]; //массив, элементы которого и являются элементами стека
  9. short int capacity; //свободное место в массиве
  10. link* next; //адресс следующего звена
  11. link () //создание звена
  12. {
  13. capacity = link_array_size;
  14. }
  15. void link_push (int n)
  16. {
  17. capacity--;
  18. array [capacity] = n;
  19. }
  20. int link_pop ()
  21. {
  22. capacity++;
  23. return array[capacity-1];
  24. }
  25. };
  26.  
  27. struct stack //сам стек
  28. {
  29. link* head; //указатель на первое звено
  30. int s; //количество элементов в стеке
  31. stack (link* h = NULL) // создание стека
  32. {
  33. head = h;
  34. s = 0;
  35. }
  36. void add_link() //добавление звена
  37. {
  38. link* a = new link;
  39. a->next = head;
  40. head = a;
  41. }
  42. void destroy_link() //удаление звена
  43. {
  44. link * a = head;
  45. head = a->next;
  46. delete a;
  47. }
  48. void push (int n)
  49. {
  50. if ((head == NULL)||(head->capacity == 0))
  51. {
  52. add_link();
  53. }
  54. head->link_push(n);
  55. s++;
  56. }
  57. int pop ()
  58. {
  59. if (s>0)
  60. {
  61. int n = (head->link_pop());
  62. if (head->capacity == link_array_size)
  63. {
  64. destroy_link();
  65. }
  66. s--;
  67. return n;
  68. }
  69. else
  70. {
  71. throw 0;
  72. }
  73. }
  74. int back()
  75. {
  76. if (s>0)
  77. {
  78. return head->array[head->capacity];
  79. }
  80. else
  81. {
  82. throw 0;
  83. }
  84. }
  85. int size()
  86. {
  87. return s;
  88. }
  89. void clear()
  90. {
  91. while (head!=NULL)
  92. {
  93. destroy_link();
  94. }
  95. s = 0;
  96. }
  97. };
  98.  
  99. int main()
  100. {
  101. string s;
  102. stack Q;
  103. while (cin>>s)
  104. {
  105. if (s == "push")
  106. {
  107. int n;
  108. cin>>n;
  109. Q.push(n);
  110. cout<<"ok"<<endl;
  111. }
  112. if (s == "pop")
  113. {
  114. try
  115. {
  116. cout<<Q.pop()<<endl;
  117. }
  118. catch (int e)
  119. {
  120. cout<<"error"<<endl;
  121. }
  122. }
  123. if (s == "back")
  124. {
  125. try
  126. {
  127. cout<<Q.back()<<endl;
  128. }
  129. catch (int e)
  130. {
  131. cout<<"error"<<endl;
  132. }
  133. }
  134. if (s == "size")
  135. {
  136. cout<<Q.size()<<endl;
  137. }
  138. if (s == "clear")
  139. {
  140. Q.clear();
  141. cout<<"ok"<<endl;
  142. }
  143. if (s == "exit")
  144. {
  145. cout<<"bye"<<endl;
  146. break;
  147. }
  148. }
  149. return 0;
  150. }
Success #stdin #stdout 0s 3468KB
stdin
back
size
clear
size
back
pop
push 2
pop
push 1
size
back
exit
stdout
error
0
ok
0
error
error
ok
2
ok
1
1
bye