Lila25mila
Lila25mila11 березня 2019 р. 05:28

Стек

Концепція стека

Стек є корисною структурою даних у програмуванні. Це як стос тарілок, що лежать один на одному.


Подумайте про те, що ви можете зробити з такою купою тарілок:

  • Покласти нову тарілку зверху;
  • Перемістити верхню тарілку.

Якщо ви бажаєте, щоб тарілка була внизу, необхідно прибрати всі верхні тарілки. Така домовленість називається Last In First Out або LIFO (останній увійшов, перший вийшов) - останній елемент, який був розміщений, є першим елементом, який вийде.

Стек в умовах програмування

З погляду програмування, розміщення елемента поверх стека називається "push", а видалення елемента - "pop". Останній доданий елемент називається верхівкою стека, або top.

На зображенні видно, що елемент 2 був збережений останнім, але видаляється першим, тому що підкоряється роботі принципу LIFO (останній увійшов, вийшов перший).

Ми можемо реалізувати стек будь-якою мовою програмування, такою як C, C++, Java, Python або C#, майже з однаковою специфікацією.

Специфікація стека

Стек - це об'єкт або, конкретніше, абстрактна структура даних (ADT), яка дозволяє виконувати наступні операції:

  • Push: додати елемент на початок стека;
  • Pop: видалити елемент із верхньої частини стека;
  • IsEmpty: перевірити, чи порожній стек;
  • IsFull: перевірте, чи заповнений стек;
  • Peek: отримати значення верхнього елемента, не видаляючи його.
Як працює стек

Операції працюють таким чином:

  1. Вказівник TOP називається для відстеження верхнього елемента у стеку.
  2. При ініціалізації стека ми встановлюємо його значення -1, щоб ми могли перевірити, чи стек є порожнім, порівнюючи TOP == -1.
  3. Натиснувши на елемент, ми збільшуємо значення TOP і поміщаємо новий елемент у положення, яке вказує TOP.
  4. При отриманні елемента ми повертаємо елемент, який вказує TOP, і зменшуємо його значення.
  5. Перед додаванням елемента ми перевіряємо, чи заповнений стек.
  6. Перед подовженням елемента ми перевіряємо, чи стек пустий.

Реалізація стека мовою програмування

Найбільш поширена реалізація стека використовує масиви, але можлива реалізація з використанням списків.

Ось реалізація, що використовує масиви С.

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

#define MAX 10

struct stack
{
    int items[MAX];
    int top;
};
typedef struct stack st;

void createEmptyStack(st *s)
{
    s->top=-1;
}

int isfull(st *s)
{
    if (s->top==MAX-1)
        return 1;
    else
        return 0;
}

int isempty(st *s)
{
    if (s->top==-1)
        return 1;
    else
        return 0;
}

void push(st *s)
{
    int newitem;
    printf("Enter item to be inserted: ");
    scanf("%d",&newitem);
    if (isfull(s))
    {
        printf("STACK FULL");
    }
    else
    {
        s->top++;
        s->items[s->top]=newitem;
    }
}


void pop (st *s)
{
    if (isempty(s))
    {
        printf("\n STACK EMPTY \n");
    }
    else
    {
        printf("Item popped= %d",s->items[s->top]);
        s->top--;
    }
}

void main()
{
    int ch;
    int loop;
    loop=1;
    st *s;

    createEmptyStack(s);

    do
    {
        printf("\n ***STACK OPERATIONS");
        printf("\n 1. PUSH");
        printf("\n 2. POP");
        printf("\n 3. EXIT");
        printf("\n ***************");
        printf("\n Enter your choice: ");
        scanf("%d", &ch);

        switch (ch)
        {
            case 1: 
                push(s);
                break;
            case 2:
                pop(s);
                break;
            case 3:
                printf("THANK YOU");
                loop=0;
                exit(0);
            default:
                printf("Invalid choice");
        }
    } while(loop);

    getch();
}
Використання стека

Хоча стек є простою для реалізації структуру даних, він є дуже корисним. Найбільш поширені області використання стека для виконання наступних завдань:

  • Щоб перевернути слово - складіть всі літери в стос і витягніть їх. Через порядок стека LIFO, ви отримаєте літери у зворотному порядку.
  • У компіляторах - компілятори використовують стек для обчислення значення виразів, таких як 2 + 4/5 * (7-9), шляхом перетворення виразу в префіксну або постфіксну форму.
  • У браузерах – кнопка «Назад» у браузері зберігає всі URL-адреси, які ви відвідали раніше у стеку. Щоразу, коли ви відвідуєте нову сторінку, вона додається на початок стеку. Коли ви натискаєте кнопку «Назад», поточна URL-адреса видаляється зі стека і відкривається попередня URL-адреса.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 11:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 11:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 22:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi01 листопада 2024 р. 00:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 18:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 17:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 21:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi25 червня 2024 р. 01:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 17:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 13:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 19:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах