-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1_3_1.cpp
More file actions
140 lines (123 loc) · 4.96 KB
/
Copy path1_3_1.cpp
File metadata and controls
140 lines (123 loc) · 4.96 KB
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
136
137
138
139
140
/*//==============================================================================================================
Во всех задачах из следующего списка следует написать структуру данных, обрабатывающую команды push* и pop*.
Формат входных данных.
В первой строке количество команд n. n ≤ 1000000.
Каждая команда задаётся как 2 целых числа: a b.
a = 1 - push front
a = 2 - pop front
a = 3 - push back
a = 4 - pop back
Команды добавления элемента 1 и 3 заданы с неотрицательным параметром b.
Для очереди используются команды 2 и 3. Для дека используются все четыре команды.
Если дана команда pop*, то число b - ожидаемое значение. Если команда pop вызвана для пустой структуры данных,
то ожидается “-1”.
Формат выходных данных.
Требуется напечатать YES - если все ожидаемые значения совпали. Иначе, если хотя бы одно ожидание не оправдалось,
то напечатать NO.
Реализовать очередь с динамическим зацикленным буфером (на основе динамического массива).
Требования: Очередь должна быть реализована в виде класса.
*///==============================================================================================================
#pragma GCC optimize ("Ofast")
#include <iostream>
using namespace std;
class Queue {
public:
Queue();//конструктор
~Queue();//деструктор
Queue(const Queue &other) = delete;
Queue &operator=(const Queue &other) = delete;
void Enqueue(int val);//вставка элемента в очередь
int Dequeue();//удаление элемента из очереди, возвращает -1 если очередь пуста
bool IsEmpty();//проверка на пустоту
bool IsFull();//проверка на заполненность
private:
int *data; //массив для хранения данных
int dataSize; //количество данных в массиве
int head;
int tail;
void growSize();// динамическое расширение массива
};
Queue::Queue()
: data(nullptr), dataSize(0), head(0), tail(0) //конструктор
{
growSize();
}
Queue::~Queue() { //деструктор
delete[] data;
data = nullptr;
dataSize = 0;
head = 0;
tail = 0;
}
void Queue::Enqueue(int val) { //вставка элемента в очередь
if (!IsFull()) {
data[(tail) % dataSize] = val;
tail = (tail + 1) % dataSize;
} else {
growSize();
Enqueue(val);
}
}
int Queue::Dequeue() { //удаление элемента из очереди, возвращает -1 если очередь пуста
if (IsEmpty()) { // если очередь пуста
return -1;
}
int element = data[head];
if (head == dataSize - 1) {
head = 0;
} else {
++head;
}
return element;
}
bool Queue::IsEmpty() { // проверка на пустоту
return head == tail;
}
bool Queue::IsFull() { // проверка на заполненность
return (tail + 1) % dataSize == head;
}
void Queue::growSize() { // динамическое расширение массива
int newDataSize = (dataSize > 0) ? (dataSize << 1) : 4096, // размер нового массива
*newData = new int[newDataSize]; // создаём новый массив размером newDataSize
if (head != tail) {
int j = 0;
for (int i = head; i < dataSize; ++i) {
if (tail == i) {
break;
}
newData[j++] = data[i]; // копируем данные из старого массива в новый массив
if (dataSize - 1 == i) {
i = -1;
}
}
head = 0;
tail = j;
}
delete[] data; // удаляем старый массив
data = newData;
dataSize = newDataSize;
}
int main() {
int n, op, val, elem;
cin >> n;
Queue queue;
for (int i = 0; i < n; ++i) {
cin >> op >> val;
switch (op) {
case 2:
//pop front
elem = queue.Dequeue();
if (elem != val) {
cout << "NO" << endl;
return 0;
}
break;
case 3:
//push back
queue.Enqueue(val);
break;
}
}
cout << "YES" << endl;
return 0;
}