Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <assert.h>
- #include <iostream>
- // Очередь на односвязном списке.
- class CQueue {
- public:
- ~CQueue();
- // Добавление элемента в конец очереди.
- void Push( int data );
- // Извлечение элемента. Если очередь пуста, assert.
- int Pop();
- // Пуста ли очередь.
- bool IsEmpty() const { return head == nullptr; }
- private:
- // Узел односвязного списка.
- struct CQueueNode {
- int Data;
- CQueueNode* Next;
- explicit CQueueNode( int data ) : Data( data ), Next( nullptr ) {}
- };
- CQueueNode* head = nullptr;
- CQueueNode* tail = nullptr;
- };
- CQueue::~CQueue()
- {
- while( head != nullptr ) {
- CQueueNode* toDelete = head;
- head = head->Next;
- delete toDelete;
- }
- }
- void CQueue::Push( int data )
- {
- CQueueNode* newNode = new CQueueNode( data );
- if( head == nullptr ) {
- assert( tail == nullptr );
- head = tail = newNode;
- } else {
- assert( tail != nullptr );
- tail->Next = newNode;
- tail = newNode;
- }
- }
- int CQueue::Pop()
- {
- assert( head != nullptr );
- assert( tail != nullptr );
- // Запоминаем данные, которые надо вернуть.
- const int data = head->Data;
- // Узел, который хотим удалить.
- CQueueNode* toDelete = head;
- // Сдвигаем head.
- head = head->Next;
- // Если в очереди был ровно один элемент, то head == 0, обнулим tail.
- if( head == nullptr ) {
- tail = nullptr;
- }
- delete toDelete;
- return data;
- }
- int main()
- {
- int commandsCount = 0;
- std::cin >> commandsCount;
- assert( commandsCount >= 0 );
- CQueue queue;
- for( int i = 0; i < commandsCount; ++i ) {
- int command = 0;
- int value = 0;
- std::cin >> command >> value;
- switch( command ) {
- case 3:
- queue.Push( value );
- break;
- case 2:
- if( queue.IsEmpty() && value != -1 || !queue.IsEmpty() && queue.Pop() != value ) {
- std::cout << "NO";
- return 0;
- }
- break;
- default:
- assert( false );
- }
- }
- std::cout << "YES";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement