Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-50_1.docx
Скачиваний:
9
Добавлен:
02.08.2019
Размер:
707.62 Кб
Скачать
  1. Использование динамических переменных для представления и работы со стеком.

struct tstack { int inf; tstack*next}; //описание типа стек

tstack*init_stack() // инициализация стека

{ return NULL; }

void push (tstack*&s, init item) // добавление элемента в стек

{tstack *r=new tstack;

r->inf=item; r->next=s; s=r;}

int pop (tstack*&s) // удаление элемента из стека

{ tstack*r=s;

int i=r->inf; s=r->next;

delete r; return i;}

int peek (tstack*s) // просмотр элемента, расположенного на вершине стека

{return s->inf; }

int empty_stack(tstack*s) // определение стека на пустоту

{ return(s)?0:1; }; // 0, если пуст и 1 если не пуст

Объединив все функции в файл stackint.h и сохранив его в папке INCLUDE, можно подключить его к любой программе с помощью # include <stackint.h>

Пример: Переписать из h в g в обратной последовательности.

# include <stdio.h>

# include <stackint.h>

#include <iostream>

using namespace std;

FILE*h=fopen(“input_stack.txt”, “r”); // для чтения

FILE*g=fopen(“output.txt”, “w”); // для записи

int i;

tstack*sp=init_stack(); // инициализация sp=NULL

while (!feof(h))

{ fscanf (h, “%d”, &i);

push (sp, i);

printf(“%d\t”, i); };

cout<<”\n”;

while (!empty_stack(sp)) // пока стек не пуст

{ i=pop (sp);

printf (“%d\t”, i);

fprintf (g, “%d\t”, i); } ;

fcloseall ();}

  1. Очередь, реализация очереди массивом.

Очередь – линейный список, где все включения (ввод, добавление компонент) производится с другой стороны, а исключения и всякий доступ – с другой; абстрактная структура данных, работающая по принципу FIFO. Так как доступ возможен с двух концов, существуют 2 переменные: head и tail. Можно описать и реализовать с помощью массива:

Const int n=100;

float Queue[n],x;

int head, tail;

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

  1. Инициализация очереди (присваивание начальных значений head и tail).

Пусть head = l, tail = 1. Head указывает на 1-ый элемент в очереди, tail – на последний или на l-ю свободную ячейку. Сначала tail head чтобы не переполнить массив, присвоить tail значение 1 и заполнять очередь с начала массива, т.о. закольцованная структура. Чтобы отличить пустую ячейку от непустой, оставляем 1 ячейку свободной. Если пуста, то head=tail, если полна, то head = tail+1.

  1. Взятие элементов.

If (head = tail)

cout<<”Очередь пуста”;

else {x=Queue[head];

head=head+1;

if (head = n) head = 1;}

  1. Добавление элемента.

r=tail +1;

if (r=n) r=1;

if (r=head) cout<<”Очередь полна”;

else {Queue[tail] = x;

tail = r;}

2-й вариант реализации: массив из n+1 элементов, описанного от 0 до n. tail указывает на последний элемент, head – на ячейку, предшествующую 1 элементу в очереди. Отличие: индекс tail увеличивается на 1, а затем проверка (tail=head).

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

  1. Инициализация. tail = 0, head =0.

  2. Взятие элемента:

If (head = tail)

cout<<”очередь пуста”;

else {head=((head+1)%n);

x=Queue[head];}

  1. Добавление элемента:

tail=((tail+1)%n);

if (tail=head) cout<<”Очередь полна”;

else Queue[tail]=x;

Изменение индекса массива head(tail), движение по кольцу осуществляется за счёт операции %. Если tail < n-1, то tail увеличивается на 1. (1%100)=1, (2%100)=2, но когда tail станет равным n-1, то tail присвоится 0. ((99+1)%100)=0.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]