Добавил:
ПОИТ 2016-2020 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
29.04.2018
Размер:
878.59 Кб
Скачать

If (!isStackEmpty(top))

x = St[top--];

return x;

}

При добавлении элемента индекс массива изменяется так, чтобы он указывал на следующий свободный элемент.

Элемент записывается на место, определяемое индексом.

bool Push(char val) //добавить элемент в стек

{ bool r = true;

if (r =! isStackFull(top))

St[++top] = val;

return r;

}

Главная функция:

Void main()

{ int i; char m;

Push('1'); Push('2'); Push('3');

Push('4');

for(i = 0; i < top+1; i++)

cout<<St[i]<<' ';

cout<<endl;

m = Pop();

cout<<m<<endl;

}

Реализация стека на основе массива как элемента структуры

Программа, имитирует интерфейс стека, основанного на базе статического массива.

#include <iostream>

using namespace std;

const int n = 3;

struct Stack { int A[n];

Int count;

};

void Creation(Stack *p) //создание стека

{ p -> count = 0; }

int Full(Stack *p) //проверка стека на пустоту

{ if (p -> count == 0) return 1;

else if (p -> count == n) return -1;

else return 0;

}

void Add(Stack *p) //добавление элемента

{ int value; cout<<"Введите элемент > ";

cin>>value;

p->A[p -> count] = value; p -> count++;

}

void Delete(Stack *p) //удаление элемента

{ p -> count--;

}

int Top(Stack *p) //извлеч. элемента с вершины

{ return p -> A[p -> count - 1]; }

int Size(Stack *p) //размер стека

{ return p -> count; }

Void main()

{ setlocale(LC_ALL,"Russian");

Stack s;

Creation(&s); char n;

do

{ cout<<"1. Добавить элемент"<<endl;

cout<<"2. Удалить элемент"<<endl;

cout<<"3. Вывести верхний элемент"<<endl;

cout<<"4. Узнать размер стека"<<endl;

cout<<"0. Выйти"<<endl;

cout<<"Номер команды > "; cin>>n;

switch (n)

{ case '1': if (Full(&s)==-1)

cout<<endl<<"Стек заполнен\n";

else

{ Add(&s);

cout<<endl<<"Элемент добавлен\n"; }

break;

case '2': if (Full(&s)==1)

cout<<endl<<"Стек пуст\n";

else

{ Delete(&s);

cout<<endl<<"Элемент удален\n"; }

break;

case '3': if (Full(&s)==1)

cout<<endl<<"Стек пуст\n";

else

cout<<"Верхний элемент: "<<Top(&s)<< "\n";

break;

case '4': if (Full(&s)==1)

cout<<endl<<"Стек пуст\n";

else

cout<<"Размер стека: "<<Size(&s)<<"\n";

break;

case '0': break;

default: cout<<endl<<"Команда не определена\n\n"; break; }

}

while(n != '0');

}

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

Можно организовать стек на базе массива, который изменяется динамически.

Пусть стек представлен в виде структуры:

#include <iostream>

using namespace std;

#define MYSTACK_ESE 0x000 //возврат в случае пустоты стека

struct Stack

{ int Top; //вершина стека

int Size; //размер стека

void** Data; //данные стека

};

Stack CreateStack(int n) //выделить ресурс для стека размером n

{ Stack *s = new Stack;

s -> Top = -1; s -> Size = n;

s -> Data = new void*[n];

return *s;

}

bool isStackFull(const Stack &s)// стек заполнен ?

{ return (s.Top >= s.Size - 1);

}

bool isStackEmpty(const Stack &s)// стек пуст ?

{ return (s.Top < 0);

}

void* Pop(Stack &s) // извлечь элемент с вершины стека

{ void* r = (void*)MYSTACK_ESE;

Соседние файлы в папке Лекции