Lila25mila
11 березня 2019 р. 15: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. Перед подовженням елемента ми перевіряємо, чи стек пустий.

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

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

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

  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<stdlib.h>
  4.  
  5. #define MAX 10
  6.  
  7. struct stack
  8. {
  9. int items[MAX];
  10. int top;
  11. };
  12. typedef struct stack st;
  13.  
  14. void createEmptyStack(st *s)
  15. {
  16. s->top=-1;
  17. }
  18.  
  19. int isfull(st *s)
  20. {
  21. if (s->top==MAX-1)
  22. return 1;
  23. else
  24. return 0;
  25. }
  26.  
  27. int isempty(st *s)
  28. {
  29. if (s->top==-1)
  30. return 1;
  31. else
  32. return 0;
  33. }
  34.  
  35. void push(st *s)
  36. {
  37. int newitem;
  38. printf("Enter item to be inserted: ");
  39. scanf("%d",&newitem);
  40. if (isfull(s))
  41. {
  42. printf("STACK FULL");
  43. }
  44. else
  45. {
  46. s->top++;
  47. s->items[s->top]=newitem;
  48. }
  49. }
  50.  
  51.  
  52. void pop (st *s)
  53. {
  54. if (isempty(s))
  55. {
  56. printf("\n STACK EMPTY \n");
  57. }
  58. else
  59. {
  60. printf("Item popped= %d",s->items[s->top]);
  61. s->top--;
  62. }
  63. }
  64.  
  65. void main()
  66. {
  67. int ch;
  68. int loop;
  69. loop=1;
  70. st *s;
  71.  
  72. createEmptyStack(s);
  73.  
  74. do
  75. {
  76. printf("\n ***STACK OPERATIONS");
  77. printf("\n 1. PUSH");
  78. printf("\n 2. POP");
  79. printf("\n 3. EXIT");
  80. printf("\n ***************");
  81. printf("\n Enter your choice: ");
  82. scanf("%d", &ch);
  83.  
  84. switch (ch)
  85. {
  86. case 1:
  87. push(s);
  88. break;
  89. case 2:
  90. pop(s);
  91. break;
  92. case 3:
  93. printf("THANK YOU");
  94. loop=0;
  95. exit(0);
  96. default:
  97. printf("Invalid choice");
  98. }
  99. } while(loop);
  100.  
  101. getch();
  102. }
Використання стека

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

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

Рекомендовані статті на цю тему

По статті запитували0питання

2

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    22 листопада 2024 р. 21:51
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…