115 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			115 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: Stacks | |||
|  | localeTitle: Стеки | |||
|  | --- | |||
|  | ## Стеки
 | |||
|  | 
 | |||
|  | Стеки представляют собой структуру данных First In Last Out (FILO). Это линейная структура данных. | |||
|  | 
 | |||
|  | Вы можете представить себе стопку, как тарелки были организованы в ресторане "шведский стол". Вы можете выбрать только тарелку сверху, иначе стек рухнет. Как правило, последний элемент, который нужно вставить, будет удален первым. | |||
|  | 
 | |||
|  | Некоторые основные операции стека: | |||
|  | 
 | |||
|  | 1.  Push - Вставляет элемент вверху стека. | |||
|  | 2.  Pop - Удаляет элемент в верхней части стека. | |||
|  | 3.  isEmpty - проверить, пуст ли пуст или нет. | |||
|  | 4.  Размер. Возвращает количество элементов в стеке. (Все операции могут выполняться в O (1) раз) | |||
|  | 
 | |||
|  | Реализация стека возможна с использованием массивов или связанных списков. Ниже приведена простая реализация массива структуры данных стека с наиболее распространенными операциями. | |||
|  | 
 | |||
|  | ```C++ | |||
|  | //Stack implementation using array in C++  | |||
|  |  //You can also include<stack> and then use the C++ STL Library stack class.  | |||
|  |   | |||
|  |  #include <bits/stdc++.h>  | |||
|  |   | |||
|  |  using namespace std;  | |||
|  |   | |||
|  |  class Stack {  | |||
|  |     int t;  | |||
|  |     int arr[MaxN];  | |||
|  |  public:  | |||
|  |     Stack() {  | |||
|  |         t = 0;  | |||
|  |     }  | |||
|  |     int size() {  | |||
|  |         return t;  | |||
|  |     }  | |||
|  |     bool isEmpty() {  | |||
|  |         return t < 1;  | |||
|  |     }  | |||
|  |     int top() {  | |||
|  |         return arr[t];  | |||
|  |     }  | |||
|  |     void push(int x) {  | |||
|  |         if (++t >= MaxN) {  | |||
|  |             cout << "Stack is full" << '\n';  | |||
|  |             return;  | |||
|  |         }  | |||
|  |         arr[t] = x;  | |||
|  |     }  | |||
|  |     void pop() {  | |||
|  |         arr[t--] = 0;  | |||
|  |     }  | |||
|  |  };  | |||
|  |   | |||
|  |  int main() {  | |||
|  |     Stack st;  | |||
|  |   | |||
|  |     st.push(4);  | |||
|  |     st.push(3);  | |||
|  |     st.push(5);  | |||
|  |     while (!st.isEmpty()) {  | |||
|  |         cout << st.size() << ' ' << st.top() << '\n';  | |||
|  |         st.pop();  | |||
|  |     }  | |||
|  |     return 0;  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | #### Использование массивов в виде стеков
 | |||
|  | 
 | |||
|  | В некоторых языках программирования массив имеет функциональность стека, что позволяет разработчику выполнять операции **push** и **pop** без необходимости создания структуры данных пользовательского стека. | |||
|  | 
 | |||
|  | Например, массив в JavaScript имеет методы **push** и **pop,** позволяющие легко реализовать функциональность стека в приложении. | |||
|  | 
 | |||
|  | ```js | |||
|  | stack = [];  | |||
|  |   | |||
|  |  let i = 0;  | |||
|  |  while(i < 5)  | |||
|  |   stack.push(i++);  | |||
|  |   | |||
|  |  while(stack.length) {  | |||
|  |   stack.pop();  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | Список в Python также может выполнять функции стека в приложении. Вместо **push** можно использовать метод **append** . | |||
|  | 
 | |||
|  | ```python | |||
|  | stack = []  | |||
|  |   | |||
|  |  for i in range(5):  | |||
|  |     stack.append(i)  | |||
|  |   | |||
|  |  while len(stack):  | |||
|  |     stack.pop()  | |||
|  | ``` | |||
|  | 
 | |||
|  | #### Приложения
 | |||
|  | 
 | |||
|  | *   Поверните рекурсию в цикл. | |||
|  | *   Функции Redo-Undo. | |||
|  | *   Судоку-решатель | |||
|  | *   Глубина первого поиска. | |||
|  | *   Обходы деревьев | |||
|  | *   Выражение Infix -> Префикс / Постфиксное выражение | |||
|  | *   Действительные скобки | |||
|  | 
 | |||
|  | #### Дополнительная информация:
 | |||
|  | 
 | |||
|  | *   [Дополнительная информация о Stacks - GeeksForGeeks](http://www.geeksforgeeks.org/stack-data-structure/) | |||
|  | *   [Стек - Википедия](https://en.wikipedia.org/wiki/Stack_(abstract_data_type) | |||
|  | *   [Башня Ханой Проблема и то, как в решении используются стеки и рекурсии](https://en.wikipedia.org/wiki/Tower_of_Hanoi) | |||
|  | *   [HackerRank стеки и очереди видео](https://www.youtube.com/watch?v=wjI1WNcIntg) |