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

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
  • Последние комментарии
  • Evgenii Legotckoi
    16 апреля 2025 г. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 апреля 2025 г. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    1 апреля 2025 г. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    9 марта 2025 г. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    9 марта 2025 г. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…