freeCodeCamp/guide/russian/computer-science/data-structures/stacks/index.md

115 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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