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) |