队(顺序和链式表示)

1.队列的定义和特点

1.1队列是一种先进先出的线性表,只允许在一端插入一端删除元素,可以插入的一端为队尾,可以删除的一端是队头。

队列的进入顺序跟出队顺序是一致的。

2.队列的类型定义

InitQueue(&Q)//构造一个空队列
DestroyQueue(&Q)//销毁队列
ClearQueue(&Q)//清空队列
QueueEmpty(Q)//判断是否为空队列
QueueLength(Q)//计算队列的长度
GetHead(Q)//返回队头的元素
EnQueue(&Q,e)//在队尾插入元素
DeQueue(&Q,&e)//删除队头元素
QueueTraverse(Q)//访问队里的每个元素

3.队列的操作实现

3.1队列的顺序表示和实现

1)存储结构

#define MAXSIZE 100
#define OK 1
#define ERROR -1
#define NULL 0

typedef struct
{
    QElemType *base;//一定要提前定义
    int front;
    int rear;

}SqQueue;

2)初始化

//初始化(分配一个较大的数组空间)
Status InitQueue(SqQueue &Q)//构造一个空队列
{
    Q.base=new QElemType[MAXSIZE];//QElemType记得提前定义
    if(!Q.base)
        return ERROR;
    Q.front=Q.rear=0;//头尾都是空时队列为空;
    return OK;

}

3)求队列长度

//求队列的长度
int QueueLength(SqQueue Q)
{
    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;//加上MAXSIZE的目的是为了防止前面为负数
}

4)入队

//入队(用的是尾指针)
Status EnQueue(SqQueue &Q,QEleType ,e)
{
    if((Q.rear+1)%MAXSIZE==Q.front)//首先得判断队列是否已满
    {
        return ERROR;
    }
    Q.base[Q.rear]=e;
    Q.rear=(Q.rear+1)%MAXSIZE;//先赋值,然后将尾指针后移
}

5)出队

//出队(用的是头指针),删除队头元素
Status DeQueue(SqQueue &Q,QElemType &e)
{
    if(Q.front==Q.rear)//判断队是否是空;
        return ERROR;
    e=Q.base[Q.front];//先将值返回,然后再后移;
    Q.front=(Q.front+1)%MAXSIZE;
    return OK;

}

6)取队头元素

//取队头元素
QElemType GetHead(SqQueue Q)//没有将队头元素后移
{
    if(Q.front!=Q.rear)//这里不能写他俩相等时返回什么值,不确定返回值得类型
    {
        return Q.base[Q.front];
    }
}

3.2队列的链式表示和实现

1)存储结构

//储存结构
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
    QueuePtr front,rear;
}LinkQueue;

2)初始化(构造一个空节点)

//初始化(构造一个空队列)
Status InitQueue(LinkQueue &Q)
{
    Q.front=Q.rear=new QNode;
    Q.front->next=NULL;
    return OK;
}

3)入队

//入队
Status EnQueue(LinkQueue &Q,QElemType e)//在队尾插入元素
{
    p=new QNode;
    p->data=e;
    Q.rear->next=p;
    p->next=NULL;
    Q.rear=p;//记得修改队尾指针
    return OK;

}

4)出队

//出队
Status DeQueue(LinkQueue &Q,QElemType &e)//删除队头元素
{
    if(Q.front==Q.rear)//这个需要判断队是否为空
        return ERROR;
    p=Q.front->next;
    e=p->data;
    Q.front->next=p->next;//修改头指针的指针域
    if(Q.rear==p)
    {
        Q.front=Q.rear;//易忘
    }
    delete p;
    return OK;
}

5)取队头元素

//取队头元素
QElemType GetHead(LinkQueue Q)
{
    if(Q.front!=Q.rear)
    {
        return Q.front->next->data;
    }
}

跟栈特别类似,就是特点不同,根据特点不同做出变化即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值