-
Notifications
You must be signed in to change notification settings - Fork 0
/
Queque.cs
135 lines (124 loc) · 5.97 KB
/
Queque.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using System;
internal class Program
{
private static void Main(string[] args)
{
static void Menu() //меню
{
Console.WriteLine("Выберите действие:");
Console.WriteLine("1.Напечатать список.");
Console.WriteLine("2.Добавить объект.");
Console.WriteLine("3.Удалить объект.");
Console.WriteLine("Для запуска действия введите число без дополнительных символов.");
Console.WriteLine("Для выхода введите 'exit' без кавычек.");
}
static void GetAnswer(Queue array) //процедура получения данных от пользователя
{
Console.Write("Введите номер команды: ");
string? userline = Console.ReadLine();
while (userline == null) //проверка, что строка не пустая
{
Console.WriteLine("Ошибка. Введена пустая строка."); //вывод ошибки
Console.WriteLine("Введите команду еще раз: ");
userline = Console.ReadLine(); //повторный ввод данных пользователем
}
if (userline.ToLower() != "exit")
{
if (userline == "1")
{
array.Print(); //процедура печати очереди
}
else if (userline == "2")
{
array.Enqueue(); //процедура добавления объекта в очередь
}
else if (userline == "3")
{
array.Dequeue(); //процедура удаления объекта из очереди
}
else Console.WriteLine("Введена неизвестная команда.");
GetAnswer(array); //повторный запуск считывания ввода пользователя
}
else //пользователь ввел 'exit'
{
Console.WriteLine("Вы вышли из программы."); //выход из программы
}
}
Queue queue = new Queue(); //инициализация очереди
Menu(); //вывод меню
GetAnswer(queue);
Console.ReadKey(); //задержка экрана
}
class Queue //класс "очередь"
{
const int len = 4; //длина класса, константа
int?[] info = new int?[Queue.len]; //массив длины len
public int? head; //голова очереди
public int? tail; // хвост очереди
public void Enqueue() //процедура добавления элемента в очередь
{
int GetData() //функция считывания нового элемента
{
Console.Write("Введите новый элемент: ");
int num = Convert.ToInt32(Console.ReadLine());
return num;
}
if (head == null) //если нет головы, то заполняем
{
head = 0;
tail = 0;
info[head] = GetData();
}
else //голова заполнена
{
if (tail < Queue.len - 1) tail++; // индекс хвоста, куда будем добавлять элемент
else tail = 0; //если дошли до конца списка, то переходим в начало
if (tail == head) //хвост совпал с головой
{
Console.WriteLine("Ошибка. Очередь полна.");
if (tail == 0) tail = Queue.len - 1; //возвращаем исходное значение хвоста
else tail--;
}
else //хвост не совпал с головой
{
info[tail] = GetData(); //заполняем ячейку данными
}
}
}
public void Dequeue() //удаление элемента из очереди
{
if (head == null) Console.WriteLine("Ошибка. Очередь пуста."); //нет элементов – очередь пуста
else
{
if (head != tail) //не один элемент в очереди
{
info[head] = null; //обнуляем данные головы
if (head < Queue.len - 1) head++; //обновляем индекс головы
else head = 0;
}
else //один элемент в очереди
{
info[head] = null; //обнуляем все, список пуст
head = null;
tail = null;
}
}
}
public void Print() //печать очереди
{
if (head == null) Console.WriteLine("Ошибка. Очередь пуста.");
else //очередь не пуста
{
Console.Write("Cписок:");
int? printed = head;
while (printed != tail)
{
Console.Write($" {info[printed]}");
if (printed < Queue.len - 1) printed++; //обновляем индекс элемента
else printed = 0;
}
Console.WriteLine($" {info[printed]}"); //дописываем хвост
}
}
}
}