Стеки

Определение стека

Стек — динамическая структура данных, для которой выполняется правило: последним пришёл — первым ушёл. Таким образом, и дополнение новых данных, и извлечение их из стека всегда выполняется с одной стороны.

Вершина стека — эта та его часть, через которую ведётся вся работа. На вершину стека добавляются новые элементы, и с вершины стека снимаются (удаляются) элементы.

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

Примером стека может служить коробка, в которую сверху укладывают книги. Извлекать книги также приходится сверху.

Операции со стеком

Рассмотрим основные и дополнительные действия со стеком. Для работы используем структуры Data и Stek:

struct Data

{

   int a;

};


struct Stek

{

   Data d;

   Stek *next;

};

В программе определяем указатель на начало будущего стека:

Stek *u = NULL;

После этого можно начать работать со стеком.

1. Добавление в стек. Функцию добавления назовём Push() — по аналогии с командой ассемблера push, которая заносит целое число в программный стек.

void Push(Stek **u, Data &x)

{

   Stek *t = new Stek; // Память под новый элемент

   t->d.a = x.a;       // Заполнение полей

   t->next = *u;       // Подключаем новый элемент к имеющимся

   *u = t;             // Перенастройка вершины

}

Обратиться к функции можно так:

Push(&u,x);

где x — объект типа Data.

2. Извлечение из стека. Здесь снова аналогия с ассемблером (команда pop выталкивает целое число из стека).

bool Pop(Stek **u, Data &x)

{

   if(*u == NULL)

   {

      cout << "Pustoj stek" << endl;

      return false;

   }

   Stek *t = *u;

   x.a = t->d.a; // Получаем значения полей на вершине стека

   *u = t->next; // Перенастройка вершины

   delete t;     // Удаление ненужного элемента

   return true;

}

Пример вызова функции:

Data y;

if(Pop(&u, x))

{

   y = x;

   cout << "y=" << y.a << endl;

}

Дополнительные действия со стеком — распечатка стека (можно взять алгоритм для работы с односвязным списком) и чтение с вершины стека. Чтение напоминает извлечение, но при этом данные из стека не удаляются. Вот возможный вариант реализации:

bool Read(Stek **u, Data &x)

{

   if(*u == NULL)

   {

      cout << "Pustoj stek" << endl;

      return false;

   }

   Stek *t = *u;

   x.a = t->d.a; // Заполнение полей

   return true;

}

Использование функции Read() может быть аналогичным использованию Pop().

Hosted by uCoz
Назад
На верх
Вперёд
Hosted by uCoz