关于顺序和链队列

关于队列

  • 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
  • 队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出。
  • 队列有顺序队列和链队列。

    顺序队列

    下面是顺序队列的一些操作代码:

    1. 头文件的定义
      #include "stdio.h"    
      #include "stdlib.h"   
      #include "io.h"  
      #include "math.h"
      #include "time.h"
      #define OK 1
      #define ERROR 0
      #define TRUE 1
      #define FALSE 0
      #define MAXSIZE 20 /* 存储空间初始分配量 */COPY

      2.结构体的定义


typedef int Status; 
typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */

/* 循环队列的顺序存储结构 */
typedef struct
{
    QElemType data[MAXSIZE];
    int front;      /* 头指针 */
    int rear;       /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
}SqQueue;
COPY

3.将队列中的元素输出

Status QueueTraverse(SqQueue Q)
{ 
    int i;
    i=Q.front;
    while((i+Q.front)!=Q.rear)
    {
        visit(Q.data[i]);
        i=(i+1)%MAXSIZE;
    }
    printf("\n");
    return OK;
}

Status visit(QElemType c)
{
    printf("%d ",c);
    return OK;
}COP

4.初始化一个空的队列

Status InitQueue(SqQueue *Q)
{
Q->front=0;
Q->rear=0;
return  OK;
}COPY

5.插入要插入的元素,需要先判断队列是否已满

Status EnQueue(SqQueue *Q,QElemType e)
{
if ((Q->rear+1)%MAXSIZE == Q->front)    /* 队列满的判断 */
    return ERROR;
Q->data[Q->rear]=e;         /* 将元素e赋值给队尾 */
Q->rear=(Q->rear+1)%MAXSIZE;/* rear指针向后移一位置, */
                            /* 若到最后则转到数组头部 */
return  OK;         
}COPY

6.删除队列的元素,元素只能从表头出,即Q->front->data;

Status DeQueue(SqQueue *Q,QElemType *e)
{
if (Q->front == Q->rear)            /* 队列空的判断 */
    return ERROR;
*e=Q->data[Q->front];               /* 将队头元素赋值给e */
Q->front=(Q->front+1)%MAXSIZE;  /* front指针向后移一位置, */
                                /* 若到最后则转到数组头部 */
return  OK;
}COPY

7.求队列的长度


int QueueLength(SqQueue Q)
{
return  (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}COPY

链队列

  • 链队列和顺序队列大致相同,结构体需要定义两个来存放链的数据域和指针域;
  • 队列的链式存储也称为链队列。为了便于操作,可给链队列添加一个头结点,并令头指针指向头结点。队列为空的判断条件是头指针和尾指针的值相同,且均指向头结点。
    typedef struct QNode    /* 结点结构 */
    {
    QElemType data;
    struct QNode *next;
    }QNode,*QueuePtr;
    typedef struct          /* 队列的链表结构 */
    {
    QueuePtr front,rear; /* 队头、队尾指针 */
    }LinkQueue;COPY
  • 创造一个队列需要对空间进行申请
    
    Status InitQueue(LinkQueue *Q)
    { 
    Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
    if(!Q->front)
        exit(OVERFLOW);
    Q->front->next=NULL;
    return OK;
    }
    ```- 

                     

文章转载至:http://blog.bools.cn/archives/822

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值