Структура данных и алгоритмы - Стек

Стек - это абстрактный тип данных (ADT), обычно используемый в большинстве языков программирования. Он называется стек, так как ведет себя, например, как реальный стек - колода карт, стопка тарелок и т. Д.

Реальный стек позволяет выполнять операции только на одном конце. Например, мы можем разместить или удалить карточку или тарелку только из верхней части стопки. Точно так же Stack ADT позволяет все операции с данными только на одном конце. В любой момент времени мы можем получить доступ только к верхнему элементу стека.

Эта функция делает его структурой данных LIFO. LIFO расшифровывается как Last-in-first-out. Здесь первым осуществляется доступ к элементу, который помещен (вставлен или добавлен) последним. В терминологии стека операция вставки называетсяPUSH операция и операция удаления называется POP операция.

Представление стека

На следующей диаграмме изображен стек и его операции -

Стек может быть реализован с помощью массива, структуры, указателя и связанного списка. Стек может быть либо фиксированного размера, либо иметь динамическое изменение размера. Здесь мы собираемся реализовать стек с использованием массивов, что делает его реализацией стека фиксированного размера.

Основные операции

Операции со стеком могут включать инициализацию стека, его использование и последующую деинициализацию. Помимо этих основных вещей, стек используется для следующих двух основных операций:

  • push() - Размещение (сохранение) элемента в стеке.

  • pop() - Удаление (доступ) элемента из стека.

Когда данные помещаются в стек.

Чтобы использовать стек эффективно, нам также необходимо проверить его состояние. С той же целью в стеки добавлены следующие функции:

  • peek() - получить верхний элемент данных стека, не удаляя его.

  • isFull() - проверьте, заполнен ли стек.

  • isEmpty() - проверить, пуст ли стек.

Мы всегда поддерживаем указатель на последние PUSH-данные в стеке. Поскольку этот указатель всегда представляет верхнюю часть стека, поэтому он называетсяtop. Вtop указатель предоставляет верхнее значение стека, не удаляя его.

Сначала мы должны узнать о процедурах для поддержки функций стека -

заглянуть ()

Алгоритм функции peek () -

begin procedure peek
   return stack[top]
end procedure

Реализация функции peek () на языке программирования C -

Example

int peek() {
   return stack[top];
}

полон()

Алгоритм функции isfull () -

begin procedure isfull

   if top equals to MAXSIZE
      return true
   else
      return false
   endif
   
end procedure

Реализация функции isfull () на языке программирования C -

Example

bool isfull() {
   if(top == MAXSIZE)
      return true;
   else
      return false;
}

пусто()

Алгоритм функции isempty () -

begin procedure isempty

   if top less than 1
      return true
   else
      return false
   endif
   
end procedure

Реализация функции isempty () на языке программирования C немного отличается. Мы инициализируем вершину со значением -1, поскольку индекс в массиве начинается с 0. Итак, мы проверяем, находится ли вершина ниже нуля или -1, чтобы определить, пуст ли стек. Вот код -

Example

bool isempty() {
   if(top == -1)
      return true;
   else
      return false;
}

Нажать операцию

Процесс помещения нового элемента данных в стек известен как операция проталкивания. Операция push включает в себя ряд шагов -

  • Step 1 - Проверяет, заполнен ли стек.

  • Step 2 - Если стек заполнен, выдает ошибку и выходит.

  • Step 3 - Если стек не заполнен, увеличивается top чтобы указать следующее пустое пространство.

  • Step 4 - Добавляет элемент данных в то место стека, куда указывает вершина.

  • Step 5 - Возвращает успех.

Если связанный список используется для реализации стека, то на шаге 3 нам нужно динамически распределять пространство.

Алгоритм работы PUSH

Простой алгоритм для операции Push может быть получен следующим образом:

begin procedure push: stack, data

   if stack is full
      return null
   endif
   
   top ← top + 1
   stack[top] ← data

end procedure

Реализовать этот алгоритм на C очень просто. См. Следующий код -

Example

void push(int data) {
   if(!isFull()) {
      top = top + 1;   
      stack[top] = data;
   } else {
      printf("Could not insert data, Stack is full.\n");
   }
}

Поп-операция

Доступ к содержимому при удалении его из стека известен как Pop Operation. В массиве реализации операции pop () элемент данных фактически не удаляется, вместо этогоtopуменьшается до более низкой позиции в стеке, чтобы указать на следующее значение. Но в реализации связанного списка pop () фактически удаляет элемент данных и освобождает пространство памяти.

Операция Pop может включать следующие шаги:

  • Step 1 - Проверяет, пуста ли стопка.

  • Step 2 - Если стек пуст, выдает ошибку и выходит.

  • Step 3 - Если стек не пуст, обращается к элементу данных, в котором top указывает.

  • Step 4 - Уменьшает значение вершины на 1.

  • Step 5 - Возвращает успех.

Алгоритм работы Pop

Простой алгоритм работы Pop может быть получен следующим образом:

begin procedure pop: stack

   if stack is empty
      return null
   endif
   
   data ← stack[top]
   top ← top - 1
   return data

end procedure

Реализация этого алгоритма на C выглядит следующим образом:

Example

int pop(int data) {

   if(!isempty()) {
      data = stack[top];
      top = top - 1;   
      return data;
   } else {
      printf("Could not retrieve data, Stack is empty.\n");
   }
}

Чтобы получить полную стековую программу на языке программирования C, щелкните здесь .