Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.16 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. struct Phrase { // Наша фраза (в С++ структура является классом, если приебутся)
  8. string subject, verb, noun, adjective; // это наши члены предложения
  9. bool ExtendedType; // если содержит Adjective (прилагательное), то надо выставить в true.
  10.  
  11. Phrase(const string &subject, const string &verb, const string &noun) { // Конструктор
  12. /* Тут мы присваеваем нашим полям значения, в т. ч. и значения по умолчанию */
  13. ExtendedType = false;
  14. this->subject = string(subject);
  15. this->verb = string(verb);
  16. this->noun = string(noun);
  17. }
  18.  
  19. Phrase(const string &subject, const string &verb, const string &adjective, const string &noun) { // Конструктор для расширенного типа структуры (ExtendedType = true)
  20. /* То же самое, что и в предыдущем конструкторе */
  21. ExtendedType = true;
  22. this->subject = string(subject);
  23. this->verb = string(verb);
  24. this->adjective = string(adjective);
  25. this->noun = string(noun);
  26. }
  27.  
  28. Phrase(const Phrase *phrase) { // copy constructor from a pointer - конструктор копирования
  29. subject = phrase->subject;
  30. verb = phrase->verb;
  31. noun = phrase->noun;
  32. ExtendedType = phrase->ExtendedType;
  33. if (ExtendedType)
  34. adjective = phrase->adjective;
  35. }
  36.  
  37. //No dynamically allocated fields, so no need for destructor. - деструктор можем оставить по умолчанию, т.к. динамическая память не выделяется
  38.  
  39. string getSubject() { // это геттер для subject'а
  40. return subject;
  41. }
  42.  
  43. };
  44.  
  45. ostream& operator<<(ostream& os, Phrase *phrase) { // Перегруженный оператор <<, нужен, чтобы выводить предложения в заданном формате (указанном в задании)
  46. os << phrase->subject << " " << phrase->verb << " kein "; // выводим предложение
  47. if (phrase->ExtendedType) // если есть прилагательное, выводим и его
  48. os << phrase->adjective << " ";
  49. os << phrase->noun << "."; // окончание вывода
  50. return os; // возврат объекта вывода ostream
  51. }
  52.  
  53. struct Node { // Узел (нод)
  54. Phrase *phrase; // указатель на Фразу
  55. Node *nextNode; // указатель следующий и предыдущий ноды
  56. Node *prevNode;
  57.  
  58. Node(Phrase *phrase, Node *nextNode = nullptr, Node *prevNode = nullptr) : /* это инициализирующий конструктор называется */ phrase(phrase), nextNode(nextNode), prevNode(prevNode) {}
  59.  
  60. ~Node() {
  61. delete phrase;
  62. } // т.к. динамич. память есть (выделенная new), то нужен деструктор
  63. };
  64.  
  65. class Stack { // Стек
  66. Node *head; // вершина стека
  67. int size; // размер стека
  68.  
  69. public:
  70. Stack() : head(nullptr), size(0) {} // Инициализирующий конструктор
  71.  
  72. ~Stack() {
  73. /* тут мы бежим по линейному списку и удаляем каждый его элемент */
  74. Node *cur, *next = nullptr;
  75. cur = head;
  76. if (cur != nullptr)
  77. next = cur->nextNode;
  78. delete cur;
  79. while (cur != nullptr) {
  80. delete cur;
  81. cur = next;
  82. next = next->nextNode;
  83. }
  84. }
  85.  
  86. void push(const Phrase *phrase) { // этот метод добавляет элемент в стек
  87. Phrase *tempPhrase = new Phrase(*phrase); //creating a copy of a phrase - создаем копию Phrase
  88. Node *node = new Node(tempPhrase);
  89. if (size == 0)
  90. head = node; // если размер стека - 0, то вершиной служит node, созданный нами выше
  91. else { // во всех остальных случаях
  92. Node *cur = head;
  93. head->nextNode = node;
  94. node->prevNode = head;
  95. head = node; // перед тем как приравнять node вершине стека, нужно поместить в указатель на текущий нод(узел) вершину
  96. }
  97. size++;
  98. }
  99.  
  100. Phrase *peek() {
  101. if (size == 0)
  102. return nullptr; // если стек пуст, то и возвращать нечего
  103. return head->phrase; // в другом случае возвращаем нашу фразу
  104. }
  105.  
  106. Phrase *pop() { // Удаление со стека
  107. if (size == 0)
  108. return nullptr; // если стек пуст, поступаем так же
  109.  
  110. Node *temp = head; // указатель на временную ноду = head (вершине стека, точнее адресу)
  111. head = head->prevNode;
  112. Phrase *tempPhrase = new Phrase(*temp->phrase);
  113. delete temp;
  114. size--;
  115. return tempPhrase;
  116. }
  117.  
  118. int getSize() {
  119. return size;
  120. }
  121.  
  122. bool isEmpty() {
  123. return size == 0;
  124. }
  125.  
  126. };
  127.  
  128. int main() {
  129. vector<Phrase *> strings;
  130. strings.push_back(new Phrase("Ich", "hore", "Larm"));
  131. strings.push_back(new Phrase("Er", "sah", "Katzen"));
  132. strings.push_back(new Phrase("Ich", "hore", "sanfte", "Musik"));
  133. strings.push_back(new Phrase("Er", "sieht", "schwarze", "Katze")); // Это наши примеры предложений.
  134.  
  135. Stack *stack = new Stack(); // Создаем стек
  136. for (int i = 0; i < 4; i++)
  137. stack->push(strings[i]); // Пушим туда наши строки
  138.  
  139. cout << stack->pop() << endl; // А далее следуют, начиная с этой строки, примеры работы твоего интерфейса, просто куча тестиков, типо подтвердить что все работает.
  140. cout << "Vector still contains it, so it is copied properly:\n" << strings[3] << endl; // мы копируем все по правильному
  141. Phrase *phr = stack->peek(); // тырим нашу фразу
  142. cout << "Stack size is " << stack->getSize() << ", which is proper.\n" << endl;
  143. cout << "Peek() return phrase: " << phr << endl;
  144. stack->pop();
  145. stack->pop();
  146. stack->pop(); // удаляем эл-ты со стека
  147.  
  148. cout << "When the stack size is " << stack->getSize() << ", pop() and push() will return a nullptr."; // когда размер стека = 0, то pop() и push() возвращают nullptr (хотя мне кажется на мой косой взгляд что только pop() возвращает nullptr, но эт неточно)
  149. phr = stack->pop();
  150. // а это подтверждение предыдущей фразы
  151. if (phr == nullptr)
  152. cout << "This phrase pointer is a nullptr." << endl;
  153. else
  154. cout << "This phrase pointer is not a nullptr." << endl; // проверка
  155.  
  156. cout << "Now, let's delete the stack completely, and check that the original phrases are still in place." << endl;
  157. delete stack; // стек удалили, а строки остались (как и требовалось в задании)
  158. for (int i = 0; i < 4; i++)
  159. cout << strings[i] << endl;
  160.  
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement