双端队列(deque)
最近在学栈和队列,发现一种限定性数据结构,可以同时体现栈和队列的特性,于是花了一晚上进行总结,还是有点开心的啦!
ps:蒟蒻写代码 大佬看看就好(疯狂暗示~)
简述
双端队列(deque)是限定插入和删除操作在表的两端进行的线性表。这两端分别称做端点1和端点2。
也可以像栈一样,可以用一个铁道转轨网络来比喻双端队列。
思路
1.deque的声明
定义两个结构体:
typedef struct DQueuelist
{
int data;
struct DQueuelist *prior;
struct DQueuelist *next;
}DQueuelist,*DQueueptr;
typedef struct
{
DQueueptr front;
DQueueptr rear;
}LinkDQueue;
2.deque有关函数
双向链表->双端队列
声明:
//function declaration
void Error(char *s); //check out the error
LinkDQueue Create_DQueuelist(); //create a deque
void En_DQueuelist(LinkDQueue &q, int e); //enqueue
void De_DQueuelist(LinkDQueue &q, int e); //dequeue
void Print_DQueuelist(LinkDQueue &q); //print the deque
int Getlength_DQueuelist(LinkDQueue &q); //get the length of deque
void Gethead_DQueulist(LinkDQueue &q); //get the head of deque
void Destroy_DQueuelist(LinkDQueue &q); //destroy the deque
定义:
//function definition
void Error(char *s)
{
cout<<s<<endl;
exit(1);
}//Error
LinkDQueue Create_DQueuelist()
{
DQueuelist *pnew;
LinkDQueue head;
head.front=head.rear=(struct DQueuelist*)malloc(LEN);
head.front->data=0;
head.front->next=NULL;
head.rear->next=NULL;
int length=0;
int number=0;
cout<<"please input the length of deque:";
cin>>length;
cout<<"please input the elements of deque:";
for(int i=0;i<length;i++)
{
pnew=(struct DQueuelist*)malloc(LEN);
if(!pnew)
Error("Memory alloction failure!");
cin>>number;
pnew->data=number;
pnew->next=NULL;
head.rear->next=pnew;
pnew->prior=head.rear;
head.rear=pnew;
}
return head;
}//create
void En_DQueuelist(LinkDQueue &q,int e)
{
int a;
DQueuelist *ptr=NULL;
DQueuelist *temp=NULL;
cout<<"Please choose the port of enqueue:";
cin>>a;
switch(a)
{
case 1:
ptr=(struct DQueuelist*)malloc(LEN);
if(!ptr)
Error("Memory allocation failure!");
ptr->data=e;
temp=q.front->next;
q.front->next=ptr;
ptr->next=temp;
temp->prior=ptr;
ptr->prior=q.front;
break;
case 2:
ptr=(struct DQueuelist*)malloc(LEN);
if(!ptr)
Error("Memory allocation failure!");
ptr->data=e;
ptr->next=NULL;
q.rear->next=ptr;
ptr->prior=q.rear;
q.rear=ptr;
break;
}
}//enqueue
void De_DQueuelist(LinkDQueue &q,int e)
{
int a;
cout<<"please input the port of dequeue:";
cin>>a;
DQueuelist *ptr=NULL;
DQueuelist *temp=NULL;
switch(a)
{
case 1:
if(q.front->next==NULL)
Error("The deque is void!");
ptr=q.front->next;
e=ptr->data;
cout<<"The dequeue element of port 1 is:"<<e<<endl;
q.front->next=ptr->next;
ptr->next->prior=q.front;
if(ptr==q.rear)
q.rear=q.front;
delete ptr;
break;
case 2:
if(q.rear==NULL)
Error("The deque is void!");
ptr=q.rear->prior;
temp=q.rear;
e=temp->data;
cout<<"The dequeue element of port 2 is:"<<e<<endl;
ptr->next=NULL;
q.rear=ptr;
if(ptr==q.front)
q.front=q.rear;
delete temp;
break;
}
}//dequeue
void Print_DQueuelist(LinkDQueue &q)
{
int e=0;
int n=0;
cout<<"Please input the port of sequential dequeue:";
cin>>n;
switch(n)
{
case 1:
while(q.front->next!=NULL)
{
DQueuelist *p=NULL;
p=q.front->next;
e=p->data;
cout<<e<<" ";
q.front->next=p->next;
if(p==q.rear)
q.rear=q.front;
}
cout<<endl;
break;
case 2:
while((q.rear!=NULL)&&(q.rear->data!=0))
{
DQueuelist *p=NULL;
DQueuelist *temp=NULL;
p=q.rear->prior;
temp=q.rear;
e=temp->data;
cout<<e<<" ";
p->next=NULL;
q.rear=p;
if(p==q.front)
q.rear=q.front;
}
cout<<endl;
break;
}
}//print
int Getlength_DQueuelist(LinkDQueue &q)
{
DQueuelist *p=NULL;
p=q.front;
int length=0;
while(p->next!=NULL)
{
length++;
p=p->next;
}
return length;
}//getlength
void Gethead_DQueuelist(LinkDQueue &q,int e)
{
cout<<"please input the port of dequeue:";
int a=0;
cin>>a;
switch(a)
{
case 1:
if(q.front->next==NULL)
Error("The deque is void!");
e=q.front->next->data;
cout<<"The first element of port 1 is:"<<e<<endl;
break;
case 2:
if(q.rear==NULL)
Error("The deque is void!");
e=q.rear->data;
cout<<"The first element of port 2 is:"<<e<<endl;
break;
}
}//gethead
void Destroy_DQueuelist(LinkDQueue &q)
{
while(q.front)
{
q.rear=q.front->next;
delete(q.front);
q.front=q.rear;
}
cout<<"The deque is destroyed successfully!"<<endl;
}
3.main函数
进行创建,入队,出队,取长度,输出:
//main
int main(void)
{
LinkDQueue Q;
Q = Create_DQueuelist();
cout << "The length of deque is:" << Getlength_DQueuelist(Q) << endl;
int m = 0;
for (int i = 0; i < 2; i++)
{
int n = 0;
cout << "please input the element requesting enqueue:";
cin >> n;
En_DQueuelist(Q, n);
}
cout << "The length after enqueue is:" << Getlength_DQueuelist(Q) << endl;
for (int j = 0; j < 2; j++)
{
De_DQueuelist(Q, m);
}
cout << "The length after dequeue is:" << Getlength_DQueuelist(Q) << endl;
Print_DQueuelist(Q);
Destroy_DQueuelist(Q);
return 0;
}
总结
也没写过几篇blog,不太知道怎么写好,以后会努力写的详细清楚点
写完双端队列感觉对链表理解更深了 还是挺有意义的叭
最近会学一学stl 希望不要再咕咕了OMG