- •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);
}
