Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <assert.h>
- using std::cin;
- using std::cout;
- struct CListNode {
- int Data;
- CListNode* Next;
- explicit CListNode( int data ) : Data( data ), Next( 0 ) {}
- };
- // Очередь на основе односвязного списка.
- class CQueue {
- public:
- CQueue();
- ~CQueue();
- // Добавление элемента в очередь.
- void Enqueue( int value );
- // Извлечение из очереди. Возвращает -1, если элементов в очереди нет.
- int Dequeue();
- private:
- CListNode* first;
- CListNode* last;
- };
- CQueue::CQueue() :
- first( 0 ),
- last( 0 )
- {
- }
- CQueue::~CQueue()
- {
- while( first != 0 ) {
- CListNode* temp = first->Next;
- delete first;
- first = temp;
- }
- }
- void CQueue::Enqueue( int value )
- {
- CListNode* newNode = new CListNode( value );
- if( first == 0 ) {
- // Очередь пуста, добавляем первый элемент.
- assert( last == 0 );
- first = last = newNode;
- } else {
- // Очередь не пуста, добавляем элемент, следующий за last.
- assert( last != 0 );
- last->Next = newNode;
- last = newNode;
- }
- }
- int CQueue::Dequeue()
- {
- if( first == 0 ) {
- // Очередь пуста.
- return -1;
- }
- if( first == last ) {
- // В очереди один элемент.
- int valueToReturn = first->Data; // Сохранили значение, чтобы потом его вернуть.
- delete first;
- first = last = 0;
- return valueToReturn;
- }
- // В очереди несколько элементов (>= 2).
- int valueToReturn = first->Data; // Сохранили значение, чтобы потом его вернуть.
- CListNode* second = first->Next; // Сохраним указатель на второй, чтобы не потерять.
- delete first; // Удалим первый.
- first = second;
- return valueToReturn;
- }
- int main()
- {
- // Считаем количество команд.
- int commandsCount = 0;
- cin >> commandsCount;
- // Заведем очередь.
- CQueue q;
- for( int i = 0; i < commandsCount; ++i ) {
- int command = 0;
- int value = 0;
- cin >> command >> value;
- switch( command ) {
- case 2: // Извлечение из начала очереди.
- if( q.Dequeue() != value ) {
- // Не дожидаемся остальных команд, сразу выводим NO.
- cout << "NO";
- return 0;
- }
- break;
- case 3: // Добавление в конец очередь.
- q.Enqueue( value );
- break;
- }
- }
- cout << "YES";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement