САОД1204.ppt
- Количество слайдов: 27
СТРУКТУРЫ И АЛГОРИТМЫ ОБРАБОТКИ ДАННЫХ Элементарные структуры данных Лекция 4
Элементарные структуры данных Коллекции. n Линейные коллекции. n Коллекции с последовательным доступом. n Стек. n Очередь. n Связные списки. n
Линейные коллекции
Линейные коллекции с прямым доступом n Массив (array) ¨ Статический массив (static array) ¨ Динамический массив (dynamic array) ¨ Символьная строка (character string) n Запись (record)
Коллекции с последовательным доступом Файл (file) n Список (list) n Стек (stack) n Очередь (queue) n Очередь приоритетов (priority queue) n
n Наиболее общей реализацией типов коллекций являются классы шаблонов (template) из стандартной библиотеки шаблонов языка C++ (Standard Template Library, STL). STL была разработана Александром Степановым и Менг Ли в Hewlett-Packard.
Стек - это динамическое множество. n Стек (stack) работает по принципу: n "последним пришел / первым ушел" (last -in / first-out - LIFO). n
Реализация стека на базе массива Добавить в стек - PUSH n Удалить из стека – POP #define MAX_RSTK 1000 typedef struct { int top; // Указатель стека int s[1000]; // Массив стека } Stack; Stack STK; n
if(STK. top==MAX_RSTK); //переполнение стека (overflow) bool Stack. Empty(Stack STK) {bool p; if(STK. top==0) p=true; //стек пуст (is empty) else p=false; return p; }
PUSH(Stack STK, int x) {STK. top++; STK. s[STK. top]=x; } n int POP(Stack STK, int x) {if(Stack. Empty(STK)) return 0; else {STK. top--; x=STK. s[STK. top]; return 1; } } n
Очередь - это динамическое множество. n Очередь (queue) работает по принципу: "первым пришел / первым ушел" First-In / First-Out (FIFO). n
Реализация очереди на базе массива
Связные списки (linked list) Структура двусторонне связанного списка: typedef struct { int *prev; int *next; int key; } List;
n Функции работы со списком: List. Search(List L, int k); //поиск n List. Insert(List L, int x); //добавление элемента n List. Delete(List L, int x); //удаление элемента n
Задания n n n Используя алгоритм работы со стеком решить следующую задачу: Поиск палиндромов в тексте. Палиндром – слово, которое читается одинаково в прямом и в обратном направлении. Примените алгоритм работы с очередью для задачи поразрядной сортировки данных (radix sort). Примените алгоритм работы со связным списком для сортировки вставками.
Схема алгоритма поразрядной сортировки данных
Схема алгоритма сортировки с использованием связного списка
Реализация класса стек на базе массива //-------------------------------------#include <vcl. h>. . . #define max. N 1000; class STACK {int *t; int n; public: STACK(int NN); int empty(); void push(int i); int pop(); }; TForm 2 *Form 2; //-------------------------------------__fastcall TForm 2: : TForm 2(TComponent* Owner) : TForm(Owner) { } //--------------------------------------
//-------------------------------------STACK : : STACK(int NN) {t=new int[NN]; n=0; } //-------------------------------------int STACK: : empty() { return n==0; } //-------------------------------------void STACK: : push(int i) {t[n++]=i; } //-------------------------------------int STACK: : pop() { return t[--n]; } //--------------------------------------
void __fastcall TForm 2: : Button 1 Click(TObject *Sender) {int j; char ss[20]; j=max. N; STACK STK(j); Memo 1 ->Align=al. Client; for(j=0; j<100; j++) {STK. push(j); } for(j=0; j<100; j++) {sprintf(ss, "%03 d", STK. pop()); Memo 1 ->Lines->Add(ss); } }
Реализация класса стек через указатели //-------------------------------------#include <vcl. h>. . . class STACK {struct node {int n; node *next; node(int i, node *t) {n=i; next=t; } }; typedef node *link; link head; public: STACK(int NN); // STACK(); int empty(); void push(int i); int pop(); }; TForm 2 *Form 2;
//-------------------------------------STACK : : STACK(int NN) // STACK : : STACK() {head=0; } //-------------------------------------int STACK: : empty() { return head==0; } //-------------------------------------void STACK: : push(int i) {head = new node(i, head); } //-------------------------------------int STACK: : pop() {int v = head->n; link t = head->next; delete head; head = t; return v; } //--------------------------------------
void __fastcall TForm 2: : Button 1 Click(TObject *Sender) {int j; char ss[200]; STACK STK(j); // STACK STK; Memo 1 ->Align=al. Client; for(j=0; j<100; j++) STK. push(j); for(j=0; j<100; j++) {sprintf(ss, "%03 d", STK. pop()); Memo 1 ->Lines->Add(ss); } }
Расчетно-графическая работа № 1 n Первая РГР охватывает 1 -5 лабораторные работы: ¨ Среда программирования Borland C++ Builder. ¨ Математические основы анализа алгоритмов. Сортировка вставками. Сортировка слиянием. ¨ Сортировки и порядковые статистики. Сортировка с помощью кучи. Быстрая сортировка. n Содержание первой РГР: ¨ Сортировка вставками. ¨ Сортировка слиянием. ¨ Сортировка с помощью кучи. ¨ Быстрая сортировка.
Расчетно-графическая работа № 2 n Темы второй расчетно-графической работы: ¨ Коллекции. Линейные коллекции. Коллекции с последовательным доступом. Стек. Очередь. Связные списки. ¨ Хеш-таблицы. n Содержание второй РГР: ¨ Поиск палиндромов в тексте. ¨ Поразрядная сортировка данных. ¨ Сортировка вставками с использованием связного списка. ¨ Применение Хеш-таблицы для определения частоты появления символьных строк.
Конец
САОД1204.ppt