Стек — это линейная структура данных, которая следует определенному порядку, в котором выполняются операции. Порядок может быть LIFO (первым пришел — первым вышел) или FILO (первым пришел последним вышел).
В основном в стеке выполняются следующие три основные операции:
Push: Добавляет элемент в стек. Если стек заполнен, это называется условием переполнения.
Pop: удаляет элемент из стека. Элементы появляются в обратном порядке, в котором они помещены. Если стек пуст, то говорят, что это условие Underflow.
Peek или Top: возвращает верхний элемент стека.
isEmpty: возвращает true, если стек пуст, иначе false.
Как понять стек практически? Есть много реальных примеров стека. Рассмотрим простой пример тарелок, наложенных друг на друга в столовой. Пластина, которая находится сверху, является первой, которая должна быть удалена, то есть пластина, которая была помещена в самое нижнее положение, остается в стопке в течение самого длительного периода времени. Таким образом, можно просто наблюдать за порядком LIFO / FILO.
Время Сложности операций над стеком:
push (), pop (), isEmpty () и peek () — все занимают O (1) время. Мы не запускаем цикл ни в одной из этих операций.
# Драйверная программа для проверки вышеуказанных функций
stack =createStack()
push(stack, str(10))
push(stack, str(20))
push(stack, str(30))
print(pop(stack) +" popped from stack")
C #
// C # программа для реализации базового стека // операции
usingSystem;
namespaceImplementStack {
classStack {
privateint[] ele;
privateinttop;
privateintmax;
publicStack(intsize)
{
ele = newint[size]; // Максимальный размер стека
top = -1;
max = size;
}
publicvoidpush(intitem)
{
if(top == max - 1) {
Console.WriteLine("Stack Overflow");
return;
}
else{
ele[++top] = item;
}
}
publicintpop()
{
if(top == -1) {
Console.WriteLine("Stack is Empty");
return-1;
}
else{
Console.WriteLine("{0} popped from stack ", ele[top]);
returnele[top--];
}
}
publicintpeek()
{
if(top == -1) {
Console.WriteLine("Stack is Empty");
return-1;
}
else{
Console.WriteLine("{0} popped from stack ", ele[top]);
returnele[top];
}
}
publicvoidprintStack()
{
if(top == -1) {
Console.WriteLine("Stack is Empty");
return;
}
else{
for(inti = 0; i <= top; i++) {
Console.WriteLine("{0} pushed into stack", ele[i]);
}
}
}
}
// Программа драйвера для проверки вышеуказанных функций
classProgram {
staticvoidMain()
{
Stack p = newStack(5);
p.push(10);
p.push(20);
p.push(30);
p.printStack();
p.pop();
}
} }
Плюсы: легко реализовать. Память сохраняется, так как указатели не задействованы. Минусы: это не динамично. Он не растет и не сжимается в зависимости от потребностей во время выполнения.
Выход :
10 pushed into stack
20 pushed into stack
30 pushed into stack
30 popped from stack
Реализация стека с использованием связанного списка
C ++
// C ++ программа для реализации стека в связанном списке #include <bits/stdc++.h>
usingnamespacestd;
// Структура для представления стека
classStackNode {
public:
intdata;
StackNode* next;
};
StackNode* newNode(intdata)
{
StackNode* stackNode = newStackNode();
stackNode->data = data;
stackNode->next = NULL;
returnstackNode;
}
intisEmpty(StackNode* root)
{
return!root;
}
voidpush(StackNode** root, intdata)
{
StackNode* stackNode = newNode(data);
stackNode->next = *root;
*root = stackNode;
cout << data << " pushed to stack\n";
}
intpop(StackNode** root)
{
if(isEmpty(*root))
returnINT_MIN;
StackNode* temp = *root;
*root = (*root)->next;
intpopped = temp->data;
free(temp);
returnpopped;
}
intpeek(StackNode* root)
{
if(isEmpty(root))
returnINT_MIN;
returnroot->data;
}
intmain()
{
StackNode* root = NULL;
push(&root, 10);
push(&root, 20);
push(&root, 30);
cout << pop(&root) << " popped from stack\n";
cout << "Top element is "<< peek(root) << endl;
return0;
}
// Это код, предоставленный rathbhupendra
С
// C программа для реализации стека связанных списков #include <limits.h> #include <stdio.h> #include <stdlib.h>
System.out.println(sll.pop() + " popped from stack");
System.out.println("Top element is "+ sll.peek());
}
}
питон
# Python-программа для реализации стека в связанном списке
# Класс для представления узла
classStackNode:
# Конструктор для инициализации узла
def__init__(self, data):
self.data =data
self.next=None
classStack:
# Конструктор для инициализации корня связанного списка
def__init__(self):
self.root =None
defisEmpty(self):
returnTrueifself.root isNoneelseFalse
defpush(self, data):
newNode =StackNode(data)
newNode.next=self.root
self.root =newNode
print"% d pushed to stack"%(data)
defpop(self):
if(self.isEmpty()):
returnfloat("-inf")
temp =self.root
self.root =self.root.next
popped =temp.data
returnpopped
defpeek(self):
ifself.isEmpty():
returnfloat("-inf")
returnself.root.data
# Драйвер программы для тестирования над классом
stack =Stack()
stack.push(10)
stack.push(20)
stack.push(30)
print"% d popped from stack"%(stack.pop())
print"Top element is % d "%(stack.peek())
# Этот код предоставлен Nikhil Kumar Singh (nickzuck_007)
C #
// код C # для реализации связанного списка
usingSystem;
publicclassStackAsLinkedList {
StackNode root;
publicclassStackNode {
publicintdata;
publicStackNode next;
publicStackNode(intdata)
{
this.data = data;
}
}
publicboolisEmpty()
{
if(root == null) {
returntrue;
}
else
returnfalse;
}
publicvoidpush(intdata)
{
StackNode newNode = newStackNode(data);
if(root == null) {
root = newNode;
}
else{
StackNode temp = root;
root = newNode;
newNode.next = temp;
}
Console.WriteLine(data + " pushed to stack");
}
publicintpop()
{
intpopped = int.MinValue;
if(root == null) {
Console.WriteLine("Stack is Empty");
}
else{
popped = root.data;
root = root.next;
}
returnpopped;
}
publicintpeek()
{
if(root == null) {
Console.WriteLine("Stack is empty");
returnint.MinValue;
}
else{
returnroot.data;
}
}
// Код драйвера
publicstaticvoidMain(String[] args)
{
StackAsLinkedList sll = newStackAsLinkedList();
sll.push(10);
sll.push(20);
sll.push(30);
Console.WriteLine(sll.pop() + " popped from stack");
Console.WriteLine("Top element is "+ sll.peek());
}
}
/ * Этот код предоставлен PrinciRaj1992 * /
Выход:
10 pushed to stack
20 pushed to stack
30 pushed to stack
30 popped from stack
Top element is 20
Плюсы: реализация связанного списка стека может расти и уменьшаться в зависимости от потребностей во время выполнения. Минусы: Требуется дополнительная память из-за использования указателей.
Мы расскажем о реализации приложений стека в отдельных постах.