- •1.2Типы данных
- •1.2.1Объявление переменной
- •1.2.2Категории типов данных
- •1.2.3Целый тип данных
- •1.2.4Данные с плавающей точкой (вещественные типы)
- •1.3Знаки операций
- •1.3.3Простое присваивание
- •1.3.4Составное присваивание
- •1.3.5Приоритеты операций и порядок вычислений
- •1.4Структура и компоненты программы на языке си
- •1.5Организация ввода-вывода в стиле си
- •1.6.1 Манипуляторы и форматирование ввода-вывода
- •1.7Математические функции
- •2Алгоритм. Элементы структурного программирования
- •2.1Понятие алгоритма
- •2.2Основные требования к алгоритмам
- •2.3Элементы структурного программирования
- •3Программирование алгоритмов линейной структуры
- •4Алгоритмы и программы ветвящейся структуры. Условный оператор if. Переключатель switch
- •4.1Алгоритмы и программы ветвящейся структуры
- •4.1.1Условный оператор if
- •If (выражение) оператор1;
- •4.1.2Логические операции
- •4.2Примеры составления алгоритмов и программ с использованием условного оператора If
- •4.3Переключатель switch
- •5Алгоритмы и программы циклической структуры
- •5.1 Понятие цикла. Разновидности циклов
- •5.3Оператор while
- •5.4Оператор do while
- •5.5Оператор continue
- •6Регулярные типы данных. Массивы
- •6.1 Понятие регулярного типа
- •6.2Алгоритмы сортировки массивов
- •6.3 Постановка задачи сортировки и методы её решения
- •6.4Алгоритм прямого упорядочения (Алгоритм сортировки выбором элемента)
- •6.5Алгоритм попарного сравнения соседних элементов («пузырьковая» сортировка)
- •6.6Алгоритм сортировки выбором элемента
- •6.7Методы доступа к элементам массивов, использование указателей
- •6.8Организация многомерных массивов. Указатели на многомерные массивы
- •7.1Описание и определение функции
- •7.2Вызов функции
- •7.3Передача параметров в функцию
- •7.4Описание прототипа функции
- •7.5Функция с переменным количеством параметров
- •7.6Понятие сигнатуры функции
- •7.7Подставляемые (встраиваемые) функции
- •7.8Передача параметров в главную функцию
- •7.9Рекурсивные вызовы функции
- •7.10Примеры составления функций
- •8Указатели
- •8.1Понятие указателя
- •8.2Инициализация указателей
- •8.3Операции с указателями
- •8.4Ссылки
- •9Структуры (struct)
- •10Динамические структуры данных
- •3.1 Односвязные списки
- •Д обавление в начало списка.
- •2 ) Добавление в середину списка.
- •У даление первого элемента списка.
- •3 )Удаление элемента из середины списка.
- •Int Data; //поле данных
- •If (!q) //...И он первый в списке
- •3.2 Стек
- •3.3 Очередь
- •11Динамические массивы
- •12Функции и массивы
- •13Указатели на функции
- •14.1Файловый ввод/вывод с помощью потоков
- •14.2 Дополнительные функции файлового ввода/вывода
- •14.3Режимы файлов
- •14.4 Двоичные файлы
- •14.5Произвольный доступ к файлам
- •Список использованных источников
3.3 Очередь
Очередь – структура данных с двусторонним доступом, то есть в один конец структуры добавляются элементы, а с другого конца исключаются.
Очередь работает по принципу FIFO (First in – first out; первым пришел – первым ушел).
Структура данных очередь полностью аналогична обыденному пониманию этого слова. Когда человек занимает очередь в магазине, он становится в конец очереди, так и элемент, добавляемый в очередь, дописывается в ее конец. Когда приходит очередь брать товар, человек берет товар и уходит, так и при извлечении элемент берется из начала очереди.
Таким образом, для организации такой структуры используются две переменные: для указания начала и конца очереди.
Н а рисунке 3.7 изображена очередь, где указатель QBegin указывает на начало очереди, а указатель QEnd указывает на конец очереди.
Операции над очередями:
инициализация очереди – в очередь попадает первый элемент;
проверить на пустоту;
добавить элемент в конец;
взять элемент из начала.
П ризнаком пустоты очереди является QBegin=nil. Это связано с тем, что элементы из очереди берутся только из начала очереди. Операция извлечения элемента из очереди идентична удалению элемента из начала списка. На рисунке 3.8 показана последовательность действий при добавлении элемента в конец очереди.
Исходная очередь (а) состоит из трех элементов. С помощью операции new создаем новый элемент (б) с указателем QNew, в поле данных (QNew->Data) которого записываем некоторое значение; указатель на следующий элемент (QNew->Next) устанавливаем в NULL, что является признаком того, что этот элемент станет последним.
После этого "перекидываем" указатели так, как показано на фрагментах (в) и (г).
Пример реализации и работы с очередью.
В данном примере реализованы основные операции работы с очередью, элементами которой могут быть целые числа. Операции по заполнению и выводу элементов очереди на экран реализованы в виде функций, которые затем вызываются в основной программе.
В примере широко используется механизм формальных параметров функций, где QB, QE – указатели на начало и конец очереди соответственно; х – значение для поля данных.
В главной функции программы объявлены идентификаторы QBegin и QEnd, которые и являются фактическими переменными-указателями на начало и конец очереди, именно они передаются в функции (если необходимо) при их вызове.
#include <iostream.h>
//предварительное описание структуры элемента очереди
struct Node;
//описание типа указателя на элемент очереди
typedef Node* PNode;
//структура элемента очереди
struct Node
{
int Data;
PNode Next;
};
//Инициализация очереди: создается первый элемент очереди
//(который также пока является и последним), на него
//устанавливаются указатели QE и QB
void Init(PNode& QB, PNode& QE, int x)
{
QE = new Node;
QE->Data = x;
QE->Next = NULL;
QB = QE;
}
//проверка очереди на пустоту
int Empty(PNode QB)
{
return (!QB);
}
//Добавление элемента в конец очереди (см. рисунок 3.8)
void Insert(PNode& QE, int x)
{
PNode p = new Node;
p->Data = x;
p->Next = NULL;
QE->Next = p;
QE = p;
}
//Удаление элемента из начала очереди
//(аналогично удалению из начала списка)
void Remove(PNode& QB, int& x)
{
if (Empty(QB))
cout<<"Очередь пуста!";
else
{
PNode p;
x = QB->Data;
p = QB;
QB = QB->Next;
delete p;
}
}
//заполнение очереди элементами
void InputQueue(PNode& QB, PNode& QE)
{
int Data;
cout<<"Введите элементы (0 - конец ввода): ";
cin>>Data;
Init(QB,QE,Data);
do
{
cin>>Data;
if (Data!=0)
Insert(QE,Data);
}
while (Data!=0);
}
//Извлечение элементов из очереди и вывод их на экран
void PrintQueue(PNode QB)
{
int Data;
cout<<"Очередь:\n";
while (!Empty(QB))
{
Remove(QB,Data);
cout<<Data<<' ';
}
cout<<endl;
}
void main()
{
//фактические указатели на начало и конец очереди
PNode QBegin, QEnd;
InputQueue(QBegin,QEnd);
PrintQueue(QBegin);
}