数据结构5-队列

队列的基本定义

队列限定允许在一端进行插入,允许在另一端进行删除,允许删除的一端称为队头(front),允许插入的一端称为队尾(rear),在对头进行的删除操作称为出队列操作(DeQueue),在队尾进行的插入操作被称为入队列操作(EnQueue)。

①循环队列

线性表的顺序存储结构同样适用于队列,可以用一组地址连续的存储单元一次存储队列中的数据元素,由于在队列的操作中,队列的头指针和尾指针只增加不减少,空间不能重复利用,会造成“假溢出”,有两种解决方法。

1.使队头(front)始终为0,每次元素出栈后,把后面的元素往前移动,效率不高。

2.将存储空间设想为圆形,也就是循环队列。

基本操作

1.初始化操作InitQueue(CqQueue &Q)

2.判空操作QueueEmpty(CqQueue Q)

3.求循环队列长度QueueLength(CqQueue Q)

4.入队列EnQueue(CqQueue &Q)

5.出队列DeQueue(CqQueue &Q,int &e)

6.取队头元素GetHead(CqQueue Q,int &e)

代码实现

#include <iostream>
#include <cstdlib>
#define QMAXSIZE 100
using namespace std;
typedef struct{
    int *elem;
    int front,rear;
}CqQueue;

void InitQueue(CqQueue &Q){  //初始化操作
    Q.elem=(int*)malloc(QMAXSIZE* sizeof(int));

    if(!Q.elem)
        return ;

    Q.front=Q.rear=0;
}

int QueueEmpty(CqQueue Q){  //判空操作
    if(Q.rear==Q.front)
        return 1;
    return 0;
}

int QueueLength(CqQueue Q){  //求队列长度
    return (Q.rear-Q.front+QMAXSIZE)%QMAXSIZE;
}

void EnQueue(CqQueue &Q,int e){  //入队列
    if((Q.rear+1)%QMAXSIZE==Q.front){
        cout<<"队列已满!"<<endl;
        return ;
    }

    Q.elem[Q.rear]=e;
    Q.rear=(Q.rear+1)%QMAXSIZE;
}

void DeQueue(CqQueue &Q,int &e){  //出队列
    if(QueueEmpty(Q)){
        cout<<"空队列!"<<endl;
        return ;
    }

    e=Q.elem[Q.front];
    Q.front=(Q.front+1)%QMAXSIZE;
}

void GetHead(CqQueue Q,int &e){  //取队首元素
    if(QueueEmpty(Q)){
        cout<<"空队列!"<<endl;
        return ;
    }

    e=Q.elem[Q.front];
}

void QueueDisplay(CqQueue Q){  //遍历队列
    cout<<"队列输出:"<<endl;

    while(Q.front%QMAXSIZE!=Q.rear)
        cout<<Q.elem[(Q.front++)%QMAXSIZE]<<" ";
    cout<<endl;
}

int main()
{
    CqQueue Q;
    InitQueue(Q);
    int n,e;
    cout<<"输入队列长度:";

    cin>>n;
    for(int i=0;i<n;i++){
        cin>>e;
        EnQueue(Q,e);
    }
    QueueDisplay(Q);

    if(QueueEmpty(Q))
        cout<<"队列为空!"<<endl;
    else cout<<"队列非空!"<<endl;

    cout<<"队列的长度为:"<<QueueLength(Q)<<endl;

    cout<<"出队操作!"<<endl;
    DeQueue(Q,e);
    QueueDisplay(Q);

    GetHead(Q,e);
    cout<<"队首元素为:"<<e<<endl;
}

②链队列

采用链式存储结构存储的队列。

基本操作

1.初始化操作InitQueue(LinkQueue &Q)

2.判空操作QueueEmpty(LinkQueue Q)

3.求循环队列长度QueueLength(LinkQueue Q)

4.入队列EnQueue(LinkQueue &Q)

5.出队列DeQueue(LinkQueue &Q,int &e)

6.取队头元素GetHead(LinkQueue Q,int &e)

代码实现

#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct QNode{  
    int date;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;

void InitQueue(LinkQueue &Q){  //初始化操作
    Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

    if(!Q.front)
        return ;

    Q.front->next=NULL;
}

int QueueEmpty(LinkQueue Q){  //判空操作
    if(Q.front==Q.rear)
        return 1;
    return 0;
}

void EnQueue(LinkQueue &Q,int e){  //入队列
    QueuePtr s=(QueuePtr)malloc(sizeof(QNode));

    s->date=e;
    s->next=NULL;
    Q.rear->next=s;
    Q.rear=s;
}

void DeQueue(LinkQueue &Q,int &e){  //出队列
    if(Q.front==Q.rear)
        return ;

    QueuePtr s=Q.front->next;
    Q.front->next=s->next;
    e=s->date;

    if(Q.rear==s)
        Q.rear=Q.front;
}

void GetHead(LinkQueue Q,int &e){  //取队首元素
    if(Q.front==Q.rear){
        cout<<"队列为空!"<<endl;
        return ;
    }

    e=Q.front->next->date;
    cout<<"队首元素为:"<<e<<endl;
}

void QueueDisplay(LinkQueue Q){  //遍历队列
    cout<<"队列输出:"<<endl;

    while(Q.front!=Q.rear){
        cout<<Q.front->next->date<<" ";
        Q.front=Q.front->next;
    }

    cout<<endl;
}

int main()
{
    LinkQueue Q;
    InitQueue(Q);
    int n,e;
    cout<<"输入队列长度:";

    cin>>n;
    for(int i=0;i<n;i++){
        cin>>e;
        EnQueue(Q,e);
    }
    QueueDisplay(Q);

    if(QueueEmpty(Q))
        cout<<"队列为空!"<<endl;
    else cout<<"队列非空!"<<endl;

    cout<<"出队列操作!"<<endl;
    DeQueue(Q,e);
    QueueDisplay(Q);

    GetHead(Q,e);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值