Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
работа с массивами.doc
Скачиваний:
10
Добавлен:
05.11.2018
Размер:
358.91 Кб
Скачать
    1. Организация стека при помощи массива

Стек - это список с одной точкой доступа к его элементам, которая называется вершиной стека. Вершину стека обычно обозначают Top. Добавить или убрать элементы можно только через его вершину. Принцип работы стека: "Последним пришел - первым вышел". Пример стека в обычном понимании – детская пирамидка в виде центрального вертикального несъемного стержня, расположенного на подставке. На этот стержень можно насадить диски: первый; второй; третий и т.д. Для того, чтобы снять с пирамидки второй диск, необходимо снять все диски, надетые после надевания третьего диска и третий диск.

Основные операции над стеком: формирование стека, добавление элемента в вершину стека, извлечение элемента из вершины стека, просмотр элементов стека.

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

Рассмотрим следующую задачу. Пусть требуется ввести некоторую последовательность символов, заканчивающуюся точкой, и напечатать ее в обратном порядке (т.е. если на входе будет "ABcEr-1." то на выходе должно быть "1-rEcBA"). Для реализации алгоритма можно сначала ввести все символы последовательности, записывая их в стек, а затем содержимое стека отпечатать в обратном порядке. Это основная особенность стека – чем позже элемент занесен в стек, тем раньше он будет извлечен из стека.

Рассмотрим программу, реализующую стек на основе одномерного массива. Обратите внимание;

  1. на «старую» запись комментариев;

  2. на кодирование возвращаемых значений из функций;

  3. на кодирование аварийных завершений программы.

Исходный текст программы:

#include "stdafx.h"

#include <conio.h>

#include <locale.h>

#include <stdlib.h>

#define k_Max 100 /* Предельный размер массива */

typedef int Type_Elements_a; /* Тип элементов массива a

стека */

typedef Type_Elements_a Type_a[k_Max]; /* Тип массива a */

Type_a a; /* Сам массив a стека */

int Top; /* Вершина стека */

Type_Elements_a r; /* Вспомогательная переменная */

/* Прототипы функций */

void ClearStack(void); /* Очиска стека */

int PushStack(Type_Elements_a x); /* Помещение элемента в стек */

int PopStack(Type_Elements_a * x); /* Извлечение элемента из стека */

void PrintStack(void); /* Печать содержимого стека */

int _tmain(int argc, _TCHAR* argv[])

{

setlocale( LC_ALL, "russian" ); /* установка русского режима */

printf("Демонстрация работы со стеком\n\n");

/* Очистка стека */

ClearStack();

printf("После очистки:\n");

/* Печать стека */

PrintStack();

/* Заполнение стека */

PushStack(3);

PushStack(2);

PushStack(7);

PushStack(-4);

PushStack(6);

printf("После добавления:\n");

/* Печать стека */

PrintStack();

/* Удаление из стека */

PopStack(&r);

printf("Считано и удалено из стека: %d\n", r);

PopStack(&r);

printf("Считано и удалено из стека: %d\n", r);

printf("После удаления:\n");

/* Печать стека */

PrintStack();

/* Заполнение стека */

PushStack(5);

/* Печать стека */

printf("После добавления:\n");

PrintStack();

/* Завершение выполнения программы */

printf("\nНажмите любую клавишу\n");

_getch();

return 0;

}

/* Функции работы со стеком */

void ClearStack(void)

/* Очиска стека */

{

Top = 0;

}

int PushStack(Type_Elements_a x)

/* Помещение элемента в стек */

{

if ((Top > k_Max))

{

/* Аварийное завершение программы */

printf("\nПереполнение стека\n");

printf("\nНажмите любую клавишу\n");

_getch();

exit(-1);

}

a[Top] = x;

Top = Top + 1;

return 0;

}

int PopStack(Type_Elements_a * x)

/* Извлечение элемента из стека */

{

if ((Top == 0))

{

/* Аварийное завершение программы */

printf("Попытка извлечения из пустого стека\n");

printf("\nНажмите любую клавишу\n");

_getch();

exit(-1);

}

* x = * (a + Top - 1); /* x = a[Top]; */

Top = Top - 1;

return 0;

}

void PrintStack(void)

/* Печать содержимого стека */

{

if ((Top > 0))

{

/* То стек не пустой */

printf("Содержимое стека\n");

/* Задание i - номеров элементов стека в обратном порядке */

for(int i = Top - 1; i >= 0; i--)

printf("%d) %d\n", i, a[i]); /* a[i] */

}

else

printf("Стек пустой...\n");

}