Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ekzamen_Informatika_otvety.doc
Скачиваний:
53
Добавлен:
11.05.2015
Размер:
443.39 Кб
Скачать

51.Стеки. Операции над стеками.

Стек организован по принципу «Первый вошел – первый вышел», так как элементы обавляются и удаляются только из вершины стека.

Стек – это последовательный список переменной длины, включение и исключение элементов из которого выполняются только с одной стороны списка, называемого вершиной стека. Другие названия стека – «магазин» и очередь, функционирующая по принципу LIFO (Last – In – First – Out – "последним пришел – первым исключается"). Примеры стека: винтовочный патронный магазин, тупиковый железнодорожный разъезд для сортировки вагонов.

Основные операции над стеком – включение нового элемента (англ. push – заталкивать) и исключение элемента из стека (англ. pop – выскакивать).

Полезными могут быть также вспомогательные операции:

  • определение текущего числа элементов в стеке;

  • очистка стека;

  • неразрушающее чтение элемента из вершины стека, которое может быть реализовано как комбинация основных операций:

x=pop(stack0); push(stack0,x).

52.Реализация стека на основе массива.

Программная реализация стека на основе массива

Пример 14.1

Файл stack.h

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include <conio.h>

////////////////////// Stack for char

typedef struct

{char *stack;

int head;

int size;

} STACK;

int Init(STACK* Stack, int nSize);

char Pop(STACK* Stack);

int Push(STACK* Stack, char cElement);

void Clear(STACK* Stack);

int GetSize(STACK* Stack);

void Free(STACK* Stack);

#include "stack.h"

////////////////////// Stack for char

///////////////////////////////////////////////

int Init(STACK* Stack, int nSize)

{Stack->stack = (char*)malloc(nSize);

if (Stack->stack == NULL) return -1;

Stack->size = nSize;

Stack->head = 0;

return nSize;}

///////////////////////////////////////////////

char Pop(STACK* Stack)

{if (Stack->head == 0) return 0;

return Stack->stack[--Stack->head]; }

///////////////////////////////////////////////

int Push(STACK* Stack, char cElement)

{if (Stack->head == Stack->size) return -1;

Stack->stack[Stack->head++] = cElement;

return 1;}

///////////////////////////////////////////////

void Clear(STACK* Stack)

{Stack->head = 0;}

///////////////////////////////////////////////

int GetSize(STACK* Stack)

{ return Stack->head;}

///////////////////////////////////////////////

void Free(STACK* Stack)

{ free(Stack->stack); }

void main()

{STACK A;

Init(&A, 8);

Push(&A, 'J');

Push(&A, 'F');

char c = Pop(&A);

53.Сортировка методом обмена(пузырька).

Задача сортировки заключается в следующем: задан список целых чисел (простейший случай) В=< K1, K2,..., Kn >. Требуется переставить элементы списка В так, чтобы получить упорядоченный список B'=< K'1, K'2,...,K'n >, в котором для любого 1<=i<=n элемент K'(i) <= K'(i+1).

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

Наиболее простой метод систематического обмена соседних элементов с неправильным порядком при просмотре всего списка слева на право определяет пузырьковую сортировку: максимальные элементы как бы всплывают в конце списка.

Пример 15.2

Функция BubbleSort() реализует алгоритм сортировки методом «пузырька»:

void BubbleSort(int a[],int n)

{

/*функции передается массив и его размерность */

int i, j; /* переменные цикла */

for (i=0; i<n; i++)

for (j=n-1; j>i; j--)

if (a[j-1] > a[j])

/*если элемент "тяжелее" следующего

swap(&a[j-1],&a[j]) /*поменять их местами */

}

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