Алгоритмизации
Скачать 1.15 Mb.
|
АлгоритмформированиястекаРассмотрим данный алгоритм для первых двух элементов. Описание структуры переменной, содержащей информационное и адресное поля: struct Stack → Шаблон структуры рекомендуется описывать глобально: struct Stack { int info; Stack *Next; } ; Объявление указателей на структуру: Stack *begin (вершина стека), *t (текущий элемент); Так как первоначально стек пуст: begin = NULL; Захват памяти под первый (текущий) элемент: t = (Stack*) malloc (sizeof(Stack)); илиt = new Stack; формируется конкретный адрес ОП (обозначим егоА1) для первого элемента, т.е. t равен А1. Ввод информации (например, i1); а) формирование информационной части: t -> info = i1; б) формирование адресной части: значение адреса вершины стека записываем в адресную часть текущего элемента (там был NULL) t -> Next = begin; t → → begin= NULL Вершина стека переносится на созданный первый элемент: begin = t; в результате получается следующее: begin(A1) → Захват памяти под второй элемент: t = (Stack*) malloc (sizeof(Stack)); или t = new Stack; формируется конкретный адрес ОП (A2) для второго элемента. Ввод информации для второго элемента (i2); а) формирование информационной части: t -> info = i2; б) в адресную часть записываем значение адреса вершины, т.е. адрес первого (предыдущего) элемента (А1): t -> Next = begin; t(A2) → Вершина стека снимается с первого и устанавливается на новый элемент (A2): begin = t; получается следующая цепочка: begin(A2) → → Обратите внимание, что действия 7, 8, 9 идентичны действиям 4, 5, 6, т.е. добавление новых элементов в стек можно выполнять в цикле, до тех пор, пока это необходимо. Функция формирования элемента стека для объявленного ранее типа данных может выглядеть следующим образом: Stack* Create(Stack *begin) { Stack *t = (Stack*)malloc(sizeof(Stack)); printf(“\n Input Info ”); scanf(“%d”, &t -> info); t -> Next = begin; return t; } Участок программы с обращением к функции Create для добавление необходимого количества элементов в стек может иметь следующий вид: … Stack *begin = NULL; int repeat = 1; while(repeat) { // repeat=1 – продолжение ввода данных begin = Create(begin); printf(“ Stop - 0 ”); // repeat=0 – конец ввода данных scanf(“%d”, &repeat); } … Если в функцию Сreateуказатель на вершину передавать по адресу и использовать для захвата памяти операцию new, то она может иметь следующий вид: void Create(Stack **pt) { Stack *t = new Stack; printf(“\n Input Info ”); scanf(“%d”, &t -> info); t -> Next = *pt; } Обращение к ней в данном случае будет: Create(&begin); |