队列数据结构c语言_数据结构与算法——队列的C语言实现

本人原创,有问题请评论,楼主会随时回来查看修改滴~

觉得有用请点个赞哦~~

1、顺序队

1d02a1f625b662d9ed956de332c822ee.png
/**
2020.04:queue
顺序结构-循环队列
判空      
判满      
求长度    
入队      
出队      
获取队头  
获取队尾  
*/
#include<bits/stdc++.h>
using namespace std;
#define QUEUESIZE 100
typedef int DataType;
typedef struct SeqQueue
{
    DataType data[QUEUESIZE];
    int front;
    int rear;
} SeqQueue;
void initQueue(SeqQueue *q)//初始化queue
{
    q->front = 0;//前部
    q->rear = 0;//尾部
}
void clearQueue(SeqQueue *q)//清空queue
{
    q->front = 0;
    q->rear = 0;
}
bool queueEmpty(SeqQueue *q)//isEmpty?
{
    return q->front == q->rear;
}
bool queueFull(SeqQueue *q)//isFull?
{
    return q->front == (q->rear+1)%QUEUESIZE;
}
DataType getHead(SeqQueue *q)//return Head
{
    DataType temp;
    if(queueEmpty(q))
    {
        return -1;
    }
    temp = q->data[q->front];//返回队头
    return temp;
}
DataType getTail(SeqQueue *q)//return tail
{
    DataType temp;
    if(queueEmpty(q))
    {
        return -1;
    }
    temp = q->data[q->rear-1];//返回队尾
    return temp;
}
DataType deQueue(SeqQueue *q)//出队
{
    DataType temp;
    if(queueEmpty(q))
        return -1;
    temp = q->data[q->front];
    q->front = (q->front+1) % QUEUESIZE;//形成循环序列,几何上相当于front--
    return temp;
}
bool enQueue(SeqQueue *q,DataType e)//入队
{
    if(queueFull(q))
        return false;
    q->data[q->rear]=e;
    q->rear=(q->rear+1)%QUEUESIZE;//形成循环序列,几何上相当于rear++
    return true;
}
int queueLength(SeqQueue *q)
{
    return (q->rear - q->front + QUEUESIZE) %QUEUESIZE;//等同于QUEUESIZE-|front-rear|
}
int Random_number()//随机产生0~222整数
{
    return rand()%222;
}
int main()
{
    srand(time(NULL));      //根据电脑时间,生成随机种子
    SeqQueue sq;

    cout<<"1--程序正在执行队列初始化...."<<endl;
    initQueue(&sq);
    cout<<"   初始化成功,正在入队20个随机元素"<<endl;
    cout<<"   入队顺序:";
    for(int i = 1; i<21; i++)
    {
        int temp_num=Random_number();
        printf("%5d",temp_num);
        enQueue(&sq,temp_num);
        if(i%10==0)
            cout<<endl<<"             ";
    }
    cout<<endl<<"   20个元素已成功入队!"<<endl<<endl;


    cout<<"2--程序正在执行入队....请输入一个正整数元素:";
    int temp_en;
    cin>>temp_en;
    if(enQueue(&sq,temp_en))
        cout<<"   入队成功!"<<endl<<endl;
    else
        cout<<"   入队失败!"<<endl<<endl;


    cout<<"3--程序正在判空...."<<endl;
    if(queueEmpty(&sq))
        cout<<"   queue is empty"<<endl<<endl;
    else
        cout<<"   queue is not empty"<<endl<<endl;

    cout<<"4--程序正在判满...."<<endl;
    if(queueEmpty(&sq))
        cout<<"   queue is full"<<endl<<endl;
    else
        cout<<"   queue is not full"<<endl<<endl;


    cout<<"5--程序正在获取长度...."<<endl;
    cout<<"   获取长度为:"<<queueLength(&sq)<<endl<<endl;


    cout<<"6--程序正在执行出队...."<<endl;
    int temp_de=deQueue(&sq);
    if(temp_de!=-1)
        cout<<"   出队元素为:"<<temp_de<<endl<<endl;
    else
        cout<<"   入队失败!"<<endl<<endl;


    cout<<"7--程序正在获取长度...."<<endl;
    cout<<"   获取长度为:"<<queueLength(&sq)<<endl<<endl;


    cout<<"8--程序正在获得队头元素...."<<endl;
    int temp_gh=getHead(&sq);
    if(temp_gh!=-1)
        cout<<"   队头元素为:"<<temp_gh<<endl<<endl;
    else
        cout<<"   获取失败!"<<endl<<endl;


    cout<<"9--程序正在获得队尾元素...."<<endl;
    int temp_gt=getTail(&sq);
    if(temp_gt!=-1)
        cout<<"   队尾元素为:"<<temp_gt<<endl<<endl;
    else
        cout<<"   获取失败!"<<endl<<endl;

}

2、链式队

1271901845c38431221a4ef1a3bc2a4e.png
/**
2020.04:queue
链式结构-队列
判空      
求长度    
入队      
出队      
获取队头  
获取队尾  
*/

#include<bits/stdc++.h>
using namespace std;

typedef int DataType;
typedef struct QNode
{
    DataType data;
    struct QNode *next;
} QNode;
typedef struct LinkQueue
{
    QNode *front,*rear;
    int count;
} LinkQueue;
bool queueEmpty(LinkQueue *q)   //isEmpty?
{
    return q->front == NULL;    //队头为空?
}
void clearQueue(LinkQueue *q)   //清空queue
{
    QNode *p = q->front;
    while(p)            //p不为空时
    {
        QNode *p1 = p;  //定义p1,让其指向p当前指向的结点
        p=p->next;      //p指向下一个结点
        free(p1);       //释放掉p1指向的结点
    }
}
void initQueue(LinkQueue *q)    //初始化queue
{
    if(queueEmpty(q)==false)    //防止初始化一个已经有结点的队列,产生崩溃
       clearQueue(q);
    else
    {
        q->front = NULL;
        q->rear = NULL;
        q->count = 0;
    }
}
DataType getHead(LinkQueue *q)  //return Head
{
    DataType temp;
    if(queueEmpty(q))
    {
        return -1;
    }
    temp = q->front->data;
    return temp;
}
DataType getTail(LinkQueue *q)  //return tail
{
    DataType temp;
    if(queueEmpty(q))
    {
        return -1;
    }
    temp = q->rear->data;   //返回队尾
    return temp;
}
DataType deQueue(LinkQueue *q)  //出队
{
    DataType temp;
    if(queueEmpty(q))
        return -1;
    QNode *p = q->front;    //队头元素
    temp = q->front->data;  //获取数据
    q->front=q->front->next;//队头后u移
    free(p);
    q->count--;             //长度-1
    return temp;
}
bool enQueue(LinkQueue *q,DataType e)//入队
{
    QNode *p = new QNode;
    p->data = e;
    p->next = NULL;
    if(queueEmpty(q))
    {
        q->front = p;       //令头尾都指向p
        q->rear = p;
    }
    else
    {
        q->rear->next=p;    //尾结点指向p,之后p为队尾结点
        q->rear=p;          //q->rear为flag,为p结点
    }
    q->count++;
    return true;
}
int queueLength(LinkQueue *q)
{
    return q->count;
}
int Random_number()         //随机产生0~222整数
{
    return rand()%222;
}
int main()
{
    srand(time(NULL));      //根据电脑时间,生成随机种子
    LinkQueue lq;
    lq.front=NULL;//指向空,防止初始化中,判空时对野指针操作(free(p1);语句处)

    cout<<"1--程序正在执行队列初始化...."<<endl;
    initQueue(&lq);
    cout<<"   初始化成功,正在入队20个随机元素"<<endl;
    cout<<"   入队顺序:";
    for(int i = 1; i<21; i++)
    {
        int temp_num=Random_number();
        if(i!=20)
        printf("%5d ->",temp_num);
        else
        printf("%5d ",temp_num);
        enQueue(&lq,temp_num);
        if(i%10==0)
            cout<<endl<<"             ";
    }
    cout<<endl<<"   20个元素已成功入队!"<<endl<<endl;


    cout<<"2--程序正在执行入队....请输入一个正整数元素:";
    int temp_en;
    cin>>temp_en;
    if(enQueue(&lq,temp_en))
        cout<<"   入队成功!"<<endl<<endl;
    else
        cout<<"   入队失败!"<<endl<<endl;


    cout<<"3--程序正在判空...."<<endl;
    if(queueEmpty(&lq))
        cout<<"   queue is empty"<<endl<<endl;
    else
        cout<<"   queue is not empty"<<endl<<endl;


    cout<<"4--程序正在获取长度...."<<endl;
    cout<<"   获取长度为:"<<queueLength(&lq)<<endl<<endl;


    cout<<"5--程序正在执行出队...."<<endl;
    int temp_de=deQueue(&lq);
    if(temp_de!=-1)
        cout<<"   出队元素为:"<<temp_de<<endl<<endl;
    else
        cout<<"   入队失败!"<<endl<<endl;


    cout<<"6--程序正在获取长度...."<<endl;
    cout<<"   获取长度为:"<<queueLength(&lq)<<endl<<endl;


    cout<<"7--程序正在获得队头元素...."<<endl;
    int temp_gh=getHead(&lq);
    if(temp_gh!=-1)
        cout<<"   队头元素为:"<<temp_gh<<endl<<endl;
    else
        cout<<"   获取失败!"<<endl<<endl;


    cout<<"8--程序正在获得队尾元素...."<<endl;
    int temp_gt=getTail(&lq);
    if(temp_gt!=-1)
        cout<<"   队尾元素为:"<<temp_gt<<endl<<endl;
    else
        cout<<"   获取失败!"<<endl<<endl;

}

复杂度分析

时间复杂度: (注:单个元素操作)

循环顺序队入队O(1) 循环顺序队出队O(1)

链式队入队O(1) 链式队出队O(1)

获取顶端元素O(1) 判满/空O(1)

空间复杂度:

循环顺序队入队O(1) 循环顺序队出队O(1)

链式队入队O(1) 链式队出队O(1)

获取顶端元素O(1) 判满/空O(1)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值