fork download
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. struct Node{ //структура звена списка
  6. int value; //передаваемое значение
  7. Node *next, *prev; //указатели на следующий и предыдущий элементы
  8. };
  9.  
  10. struct deque{
  11. Node *head=nullptr; //инициализация начала и конца списка, размера дека
  12. Node *tail=nullptr;
  13. int count=0;
  14. void push_back(int num){
  15. Node* element=new Node; //выделение памяти под новый элемент структуры
  16. element->value=num; //добавляем значение в структуру
  17. count++;
  18. if(!head){ //если список пуск
  19. head=element; //т.к элемент эдинственный,
  20. tail=head; //он является и хвостом и головой
  21. }
  22. else{
  23. element->prev=tail; //предыдущий элемент списка относительно добавленного, будет последним(хвостом)
  24. tail->next=element; //следующий элемент за хвостом это добавляемый элемент списка
  25. tail=element; //присваивание элементу статуса хвоста
  26. }
  27. cout<<"ok"<<endl;
  28. }
  29. void push_front(int num){
  30. Node *element=new Node;
  31. element->value=num;
  32. count++;
  33. if(!head){
  34. head=element;
  35. tail=head;
  36. }
  37. else{
  38. element->next=head; //следующий элемент за добавляемым элементом является хвост
  39. head->prev=element; //перед головой находится добавляемый элемент
  40. head=element; //присваивание элементу статуса головы
  41. }
  42. cout<<"ok"<<endl;
  43. }
  44. void pop_back(){
  45. if(count!=0){ //если дек не пустой
  46. cout<<tail->value<<endl;
  47. if(count>1){ //если в деке находится больше одного элемента
  48. Node *element=tail; //указываем на то, что будет использоваться хвост
  49. tail=tail->prev; //присваиваем статус хвоста предыдущему элементу
  50. tail->next=nullptr; //указываем на то, что за элементом пусто
  51. delete element; //удаляем бывший хвост
  52. count--; //уменьшаем размер дека
  53. }
  54. else{ //если в деке находится всего один элемент
  55. head=tail=0; //присваиваем ему значение ноль
  56. count--; //уменьшаем размер дека
  57. }
  58. }
  59. else cout<<"error"<<endl;
  60. }
  61. void pop_front(){
  62. if(count!=0){
  63. cout<<head->value<<endl;
  64. if(head->next){ //если в деке больше одного элемента
  65. Node *element=head; //указываем на то, что будем использовать голову
  66. head=head->next; //присваиваем статус головы следующему за бывшей головой элементу
  67. head->prev=nullptr; //указываем на то, что перед головой пусто
  68. delete element; //удаляем бывшую голову
  69. count--; //уменьшаем размер дека
  70. }
  71. else if(head==tail){ //если элемент один в деке
  72. head->next=nullptr; //указываем, что за головой пусто
  73. head=nullptr; //указываем на то, что голова тоже пуста
  74. delete head; //удаляем единственный элемент
  75. count=0; //присваиваем ноль размеру дека
  76. }
  77. }
  78. else cout<<"error"<<endl;
  79. }
  80. void back(){
  81. if(count!=0)cout<<tail->value<<endl; //выводим значение хвоста
  82. else cout<<"error"<<endl;
  83. }
  84. void front(){
  85. if(count!=0)cout<<head->value<<endl; //выводим значение головы
  86. else cout<<"error"<<endl;
  87. }
  88. void size(){
  89. cout<<count<<endl; //выводим размер дека
  90. }
  91. void clear(){
  92. count=0; //присваиваем размеру дека ноль
  93. cout<<"ok"<<endl;
  94. while(head) //цикл: пока по адресу головы что-то лежит
  95. {
  96. tail=head->next; //присваиваем статус хвоста следующему элементу, что лежит за головой
  97. delete head; //удаляем первый элемент дека
  98. head=tail; //указываем на то, что хвост принимает статус головы
  99. }
  100. }
  101. void exit(){
  102. cout<<"bye";
  103. }
  104. };
  105.  
  106. int main() {
  107. deque deq;
  108. string str;
  109. while(cin>>str){
  110. if(str=="push_front"){
  111. int num;
  112. cin>>num;
  113. deq.push_front(num);
  114. }
  115. if(str=="push_back"){
  116. int num;
  117. cin>>num;
  118. deq.push_back(num);
  119. }
  120. if(str=="pop_front")deq.pop_front();
  121. if(str=="pop_back")deq.pop_back();
  122. if(str=="clear")deq.clear();
  123. if(str=="size")deq.size();
  124. if(str=="front")deq.front();
  125. if(str=="back")deq.back();
  126. if(str=="exit"){
  127. deq.exit();
  128. break;
  129. }
  130. }
  131. return 0;
  132. }
Success #stdin #stdout 0s 15232KB
stdin
push_front 1
push_back 9
push_front 2
push_back 3
size
front
back
pop_front
pop_back
size
front
back
clear
size
back
exit


stdout
ok
ok
ok
ok
4
2
3
2
3
2
1
9
ok
0
error
bye