数据结构与算法(8)—线性队列

 

数据结构与算法(8)—线性队列

(mi6236)

1、顺序队列

1.1、队列的定义

队列(queuq)简称队,它也是一种运算受限的线形表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。我们把进行插入的一端称为队尾(rear),进行删除的一端称为队首(front)。向队列中插入新元素称作进队或入队,新元素进队后就成为新的队尾元素;从队列中删除元素称为出队,出队后,其后继元素成为队首元素。由于队列的插入和删除分别在两端进行,所以要删除的元素将是队列中最先进入的元素,因此以把队列称作先进先出(First In First Out,简称FIFO)表。

在日常生活中,人们为购物或等车时所排的队就是一个队列,新来购物或等车的人接到队尾(即进队),站在队首的人购物或上车后离去(即出队),当最后一人购物或上车后,则队为空。

1.2、队列的顺序存储结构

顺序存储结构采用一维数组(向量)实现,设队列头指针front和队列尾指针rear,并且假设front指向队头元素的前一个位置,rear指向队尾元素。若不考虑满,则入队操作语句为Q[rear++]=x;若不考虑队空,则出队操作语句为x=Q[front].当然,出队时,并不一定需要队头元素。按上述的做法,有可能出现假溢出,即队尾已到达一维数组的高端,不能再入队,但因为连续出队,队列中元素个数并未达到最大值。解决这种问题,可用循环队列。在循环队列中,需要区分队空和队满:仍用front=rear表示队空,在牺牲一个单元的前提下,用front=(rear+1)%MAX表示队列满。在这种约定下,入队操作的语句为rear=(rear+1)%MAX,Q[rear++]=x,出队操作语句为:front=(front+1)%MAX,x=Q[++front].

 

1.3、顺序队列基本函数算法描述

注:以下程序在VC6.0+WIN98下测试通过。

#include <stdio.h>

 

#define QueueSize 20  /*队列的容量*/

typedef int ElemType;

typedef struct Squeue{

    ElemType data[QueueSize];

    int front,rear;

}Squeue;

 

/*初始化队列*/

void InitQueue(Squeue *sq)

{

    sq->front=sq->rear=0;

}

 

/*判断队列是不否为空*/

int QueueEmpty(Squeue sq)

{

    if(sq.front==sq.rear)

        return 1;

    else

        return 0;

}

 

/*入队*/

int InQueue(Squeue *sq,ElemType e)

{

    if((sq->rear+1)%QueueSize==sq->front)

    {

        printf("Queue is overflow./n");

        return 0;

    }

    else

    {

        sq->rear=(sq->rear+1)%QueueSize;

        sq->data[sq->rear]=e;

        return 1;

    }

}

 

/*出队*/

OutQueue(Squeue *sq,ElemType *e)

{

    if(sq->front==sq->rear)

    {

        printf("Queue is empty./n");

        return 0;

    }

    else

    {

        *e=sq->data[sq->front];

        sq->front=(sq->front+1)%QueueSize;

        return 1;

    }

}

 

/*取队首元素*/

int GetQueue(Squeue sq,ElemType *e)

{

    if(sq.front==sq.rear)

    {

        printf("Queue is empty./n");

        return 0;

    }

    else

    {

        *e=sq.data[(sq.front+1)%QueueSize];

        return 1;

    }

}

 

/*清空队列*/

void ClearQueue(Squeue *sq)

{

    sq->front=sq->rear=0;

}

 

/*显示队列中的元素*/

void ShowQueue(Squeue sq)

{

    if (sq.front==sq.rear)

        printf("队列为空/n");

    while(sq.front!=sq.rear)

    {

        sq.front=(sq.front+1)%QueueSize;

        printf("队列中的第%d个元素是%d/n",sq.front,sq.data[sq.front]);

    }

}

 

int main()

{

    Squeue sq;

    ElemType e;

    InitQueue(&sq);

    if (QueueEmpty(sq))

        printf("队列为空/n");

    printf("请输入数字:");

    scanf("%d",&e);

    InQueue(&sq,e);

    printf("请输入数字:");

    scanf("%d",&e);

    InQueue(&sq,e);

    ShowQueue(sq);

    GetQueue(sq,&e);

    printf("队首元素为%d/n",e);

    OutQueue(&sq,&e);

    ShowQueue(sq);

    GetQueue(sq,&e);

    printf("队首元素为%d/n",e);

    ClearQueue(&sq);

    ShowQueue(sq);

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值