奇怪的队列增加了!

双端队列(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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值