Код:
#include <assert.h>
#include <iostream>
using namespace std;
struct ListNode //структура, описывающая 1 элемент очереди
{
char* data; //данные элемента
ListNode *nextPtr; //указатель на следующий элемент
ListNode *prevPtr; //указатель на предыдущий элемент
ListNode(char* value, ListNode *prev) //констуркторк элемента
{
data=value;
nextPtr=NULL;
prevPtr=prev;
}
};
class queue //класс, описывающий очередь
{
public:
queue();
~queue();
void InsertAtFront(char *);
void InsertAtBack(char *);
int RemoveFromFront(char *);
int RemoveFromBack(char *);
bool isEmpty()const;
void print()const;
int length();
friend ostream &operator<<(ostream &stream, queue *q);
friend istream &operator>>(istream &stream, queue *q);
ListNode *FirstPtr;
ListNode *LastPtr;
ListNode *GetNewNode(char *, ListNode *);
};
queue::queue() //конструктор
{
FirstPtr=LastPtr=NULL;
}
queue::~queue() //деструктор
{
if(!isEmpty())
{
cout<<"Удаление узлов..."<<endl;
ListNode*CurrentPtr=FirstPtr,*TempPtr;
while (CurrentPtr!=0) //пока не конец очереди
{
TempPtr=CurrentPtr;
cout<<TempPtr->data<<endl; //выводим удаляемый элемент
CurrentPtr=CurrentPtr->nextPtr; //переходим на следующий
delete TempPtr; //удаляем предыдущий
}
}
cout<<"Все узлы удалены!"<<endl;
}
void queue::InsertAtFront(char *value) //метод вставки в начало
{
ListNode *ptr=GetNewNode(value, NULL); //создаём новый элемент
if(isEmpty()) FirstPtr=LastPtr=ptr; //если очередь пуста, то он первый и последний
else
{
ptr->nextPtr=FirstPtr; //добавляем элемент
FirstPtr=ptr;
}
cout << "Узел добавлен в начало!" << endl;
}
void queue::InsertAtBack(char *value) //метод вставки в конец
{
ListNode *ptr=GetNewNode(value, LastPtr); //создаём новый элемент
if(isEmpty()) FirstPtr=LastPtr=ptr; //если очередь пуста, то он первый и последний
else
{
LastPtr->nextPtr=ptr; //добавляем
LastPtr=LastPtr->nextPtr;
}
cout << "Узел добавлен в конец!" << endl;
}
int queue::RemoveFromFront(char *value) //удаление из начала очереди
{
if(isEmpty())
{
cout << "Очередь пуста!" << endl;
return 0;
}
ListNode *ptr=FirstPtr;
strcpy(value,ptr->data);
if(FirstPtr==LastPtr) FirstPtr=LastPtr=NULL; //если 1 элемент, то очищаем очередь
else
{
FirstPtr=FirstPtr->nextPtr;
FirstPtr->prevPtr=NULL;
}
delete ptr;
cout << "Узел удалён из начала очереди!" << endl;
return 1;
}
int queue::RemoveFromBack(char *value) //удаление из конца очереди
{
if(isEmpty())
{
cout << "Очередь пуста!" << endl;
return 0;
}
ListNode *ptr=LastPtr;
strcpy(value,ptr->data);
if(FirstPtr==LastPtr) FirstPtr=LastPtr=NULL;
else
{
LastPtr=LastPtr->prevPtr;
LastPtr->nextPtr=NULL;
}
delete ptr;
cout << "Узел удалён из конца очереди!" << endl;
return 1;
}
bool queue::isEmpty()const //определение пуста ли очередь
{
return FirstPtr==NULL;
}
ListNode* queue::GetNewNode(char *value, ListNode *prev) //метод получения нового элемента
{
ListNode *ptr = new ListNode(value,prev);
assert(ptr!=0);
return ptr;
}
void queue::print()const //метод вывода очереди
{
if(isEmpty())
{
cout<<"Очередь пуста!"<<endl;
return;
}
ListNode *CurrentPtr=FirstPtr;
cout<<"Очередь состоит из:"<<endl;
while(CurrentPtr!=0) //пока не конец
{
cout<<CurrentPtr->data<<endl; //выводим элемент
CurrentPtr=CurrentPtr->nextPtr; //переходим на следующий
}
cout<<endl<<endl;
}
int queue::length() //определение длины
{
int k=0;
ListNode *tmp=FirstPtr;
while(tmp) //пока не конец
{
tmp=tmp->nextPtr; //переходим на следующий элемент
k++; //увеличиваем длину
}
return k; //возвращаем длину
}
ostream &operator<<(ostream &stream, queue *q)
{
ListNode *tmp=q->FirstPtr;
while(tmp)
{
stream << tmp->data << " ";
tmp=tmp->nextPtr;
}
stream << endl;
return stream;
}
istream &operator>>(istream &stream, queue *q)
{
char *data=new char;
fflush(stdin);
stream.getline(data,256);
q->InsertAtBack(data);
return stream;
}