Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cassert>
- class queue {
- int *numbers; //указатель на массив чисел
- int size_of_numb; //размер массива
- int head; // номер первого
- int tail; // номер последнего
- void up_size() //Приращение памяти
- {
- int new_size = size_of_numb > 0 ? size_of_numb*1.6 : 10; //если размер =0, то увеличиваем на 10, иначе в 1.6 раза
- int *new_numbers = new int[new_size];
- if (head != tail) { //Если начальный массив не пуст
- int temp = 0;
- for (int i = head; i <size_of_numb; i++) {
- if (i == tail) {
- break;
- }
- new_numbers[temp++] = numbers[i];
- if (i == size_of_numb - 1) {
- i = -1;
- }
- }
- head = 0;
- tail = temp;
- }
- if (numbers != NULL) { //удаление начального массива
- delete[] numbers;
- }
- numbers = new_numbers;
- size_of_numb = new_size;
- }
- public:
- queue() {
- numbers = NULL;
- size_of_numb = 0;
- head = 0;
- tail = 0;
- up_size();
- }
- ~queue() {
- if (numbers != NULL) {
- delete[] numbers;
- }
- }
- //Взятие элемента
- int pop() {
- if (head != tail) {
- // очередь не пуста
- int val = numbers[head];
- if (head == size_of_numb - 1) {
- head = 0;
- }
- else
- {
- head++;
- }
- return val;
- }
- // очередь пуста
- return -1;
- }
- // добавление элемента
- void push(int val) {
- if ((tail + 1) % size_of_numb == head) {
- //если размер массива недостаточен
- up_size();
- push(val);
- }
- else
- {
- // добавление
- numbers[(tail) % size_of_numb] = val;
- tail = (tail + 1) % size_of_numb;
- }
- }
- bool is_empty() { //Проверка на пустую очередь
- return head == tail;
- }
- };
- int main()
- {
- queue queue_for_task;
- int n = -1; //Количество команд
- std::cin >> n;
- assert(n > 0 && n < 1000000);
- bool is_OK = true;
- int command_type = 0;
- int value = 0;
- for (int i = 0; i < n; i++) {
- //Ввод типа команды и значения
- std::cin >> command_type >> value;
- assert(command_type == 2 || command_type == 3);
- switch (command_type) {
- case 2:
- if (queue_for_task.is_empty()) {
- value = -1;
- break;
- }
- is_OK = (queue_for_task.pop() == value) && is_OK;
- break;
- case 3:
- queue_for_task.push(value);
- break;
- }
- }
- std::cout << (is_OK ? "YES" : "NO");
- delete queue_for_task;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement