fork download
  1. #include<iostream>
  2. #include<string>
  3. #include<algorithm>
  4.  
  5. using namespace std;
  6.  
  7. struct node{
  8. node* Prev;
  9. node* Next;
  10. char info;
  11. };
  12.  
  13. class MyList{
  14. int count_;
  15. node *Head, *Tail;
  16. int coursor;
  17. public:
  18.  
  19. MyList() :Head(NULL), Tail(NULL), count_(0){};
  20. void Add(char);
  21. void Show();
  22. void Del(int);
  23. ~MyList();
  24. char ExactBracket(int i);
  25. void SetCoursor(int p);
  26. int GetCount();
  27. void DoCommand(char x, int i);
  28. };
  29.  
  30.  
  31. int MyList::GetCount(){
  32. return this->count_;
  33. };
  34. void MyList::Add(char x){
  35. node *temp = new node;
  36. temp->info = x;
  37. temp->Next = NULL;
  38. count_++;
  39. if (!Head){
  40. temp->Prev = NULL;
  41. Head = temp;
  42. Tail = Head;
  43. }
  44. else {
  45. temp->Prev = Tail;
  46. Tail->Next = temp;
  47. Tail = temp;
  48. }
  49. }
  50.  
  51. void MyList::Show(){
  52. node *t = Head;
  53. while (t){
  54. cout << t->info;
  55. t = t->Next;
  56. }
  57. cout << "\n\n";
  58. }
  59.  
  60. char MyList::ExactBracket(int i){
  61. if(i>=count_)
  62. return NULL;
  63. node* tmp = Head;
  64. for(int j = 0; j<i-1; j++){
  65. tmp = tmp->Next;
  66. }
  67. return tmp->info;
  68. }
  69.  
  70. void MyList::Del(int x){
  71.  
  72. if ((x==1) && (Head->Next)){ //Если удаляем первый, но есть и другие, то
  73. node *temp=Head; //Указываем, что нам нужно начало списка
  74. Head=Head->Next; //Сдвигаем начало на следующий за началом элемент
  75. Head->Prev=NULL; //Делаем так, чтоб предыдущий началу элемент был пустым
  76. delete temp; //Удаляем удаляемое начало
  77. count_--; //Обязательно уменьшаем счетчик
  78. return ; //И выходим из функции
  79. } else if ((x==1) && (Head==Tail)){ //Если удаляем первый, но в списке только 1 элемент
  80.  
  81. Head->Next=NULL; //обнуляем все что нужно
  82. Head=NULL;
  83. delete Head; //Удаляем указатель на начало
  84. count_=0; //Обязательно обозначаем, что в списке ноль элементов
  85. return; //и выходим из функции
  86. }
  87.  
  88. //Также может быть, что удаляемый элемент является последним элементом списка
  89. if (x==count_){
  90. node *temp=Tail; //Указываем, что нам нужен хвост
  91. Tail=Tail->Prev; //Отодвигаем хвост немного назад
  92. Tail->Next=NULL; //Обозначаем, что впереди за хвостом пусто
  93. delete temp; //Очищаем память от бывшего хвоста
  94. count_--; //Обязательно уменьшаем счетчик элементов
  95. return; //И выходим из функции
  96. }
  97.  
  98. //Если же удаляемый элемент лежит где-то в середине списка, то тогда его можно удалить
  99.  
  100. node *temp=Head,*temp2; //temp-Удаляемый элемент, temp2 нужен, чтобы не потерять данные
  101.  
  102. //cout<<count_<<"\n";
  103. for (int i=0;i<x-1;i++) temp=temp->Next; //Идем к адресу удаляемого элемента
  104.  
  105. temp2=temp; //Временно запоминаем адрес удаляемого элемента
  106. temp2->Prev->Next=temp->Next; //Записываем данные, что следующий за перед сейчас удаляемым элементом - это следующий от удаляемого
  107. temp2->Next->Prev=temp->Prev; //а предыдущий для следующего - это предыдущий для удаляемого
  108. delete temp; //теперь смело можно освободить память, удалив адрес на начало удаляемого элемента
  109. count_--;
  110. }
  111.  
  112. MyList::~MyList(){
  113. // cout<<"\nDELETES\n";
  114. while (Head){
  115. // cout<<"Del is: "<<Head->x<<" ";
  116. Tail=Head->Next;
  117. delete Head;
  118. Head=Tail;
  119.  
  120. }
  121. }
  122.  
  123. void MyList::SetCoursor(int p){
  124. this->coursor = p;
  125. }
  126.  
  127. void MyList::DoCommand(char x, int i){
  128. if (x == 'R'){
  129. coursor++;
  130. cout << coursor;
  131. }
  132. if (x == 'L'){
  133. coursor--;
  134. cout << coursor;
  135. }
  136. if (x == 'D')
  137. {
  138. int d = 1;
  139. int tmP = coursor;
  140. if(ExactBracket(tmP)=='('){
  141. this->Del(tmP);
  142. while (d!=0){
  143.  
  144. if(ExactBracket(tmP)=='('){
  145. d++;
  146. this->Del(tmP);
  147. }
  148. if (ExactBracket(tmP)==')'){
  149. d--;
  150. this->Del(tmP);
  151. }
  152. }
  153. }
  154.  
  155. if(ExactBracket(tmP)==')'){
  156. this->Del(tmP);
  157. while (d!=0){
  158.  
  159. if(ExactBracket(tmP)==')'){
  160. d++;
  161. this->Del(tmP);
  162. tmP--;
  163. }
  164. if (ExactBracket(tmP)=='('){
  165. d--;
  166. this->Del(tmP);
  167. tmP--;
  168. }
  169. }
  170. }
  171. }
  172. }
  173.  
  174. int main()
  175. {
  176. int n, m, p;//Скобки, команды, курсор
  177. cin >> n >> m >> p;
  178. string commands, brackets;
  179. cin >> brackets >> commands;
  180. MyList br;
  181. br.SetCoursor(p);
  182. for (int i = 0; i < n; i++){
  183. br.Add(brackets[i]);
  184. }
  185.  
  186. for (int i = 0; i < m; i++){
  187. br.DoCommand(commands[i], i);
  188. }
  189. br.Show();
  190. return 0;
  191. }
Runtime error #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
Standard output is empty