数据结构_4:队列:C语言

来源:互联网 发布:node书推荐 编辑:程序博客网 时间:2024/06/13 22:40
  • 顺序队列=====假溢出

循环队列

  • 初始化—– Q.front=Q.rear=0
  • 队首指针进1—Q.front=(Q.front+1)%MaxSize
  • 队尾指针进1—Q.rear=(Q.rear+1)%MaxSize
  • 队列长度——(Q.rear+MaxSize-Q.front)%MaxSize
  • 出队入队:指针都顺时针进1

判断队列是否是空

  • 牺牲一个单元来区分对空和对满:入队时少用一个单元==对头指针在队尾指针的下一个位置作为对满的标志
  • 队满: (Q.rear+1)%MaxSize==Q.front
  • 队空:Q.front==Q.rear
  • 队列的元素个数: (Q.rear-Q.front+MaxSize)%MaxSize

  • 数据结构
typedef int Status; typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int *//* 循环队列的顺序存储结构 */typedef struct{    QElemType data[MAXSIZE];    int front;      /* 头指针 */    int rear;       /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */}SqQueue;
  • 基本函数
/* 初始化一个空队列Q */Status InitQueue(SqQueue *Q){    Q->front=0;    Q->rear=0;    return  OK;}/* 若队列Q为空队列,则返回TRUE,否则返回FALSE */Status QueueEmpty(SqQueue Q){     if(Q.front==Q.rear) /* 队列空的标志 */        return TRUE;    else        return FALSE;}/* 返回Q的元素个数,也就是队列的当前长度 */int QueueLength(SqQueue Q){    return  (Q.rear-Q.front+MAXSIZE)%MAXSIZE;}/* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */Status GetHead(SqQueue Q,QElemType *e){    if(Q.front==Q.rear) /* 队列空 */        return ERROR;    *e=Q.data[Q.front];    return OK;}/* 若队列未满,则插入元素e为Q新的队尾元素 */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;}/* 若队列不空,则删除Q中队头元素,用e返回其值 */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;}

练习题

  • 两个队列模拟一个栈
    http://www.cnblogs.com/kaituorensheng/archive/2013/03/02/2939690.html

  • q1是专职进出栈的,q2只是个中转站

  • 入栈:直接入队列q1即可

  • 出栈:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中
void Push(Queue *q1, Queue *q2, int k){        EnQueue(q1, k);}int  Pop(Queue *q1, Queue *q2){    int tmp;    if(IsQueueEmpty(q1) == 1)    {       printf("Stack Empty!\n");    }    else    {        while(SizeOfQueue(q1) != 1)        {            EnQueue(q2, DeQueue(q1));        }        tmp = DeQueue(q1);        while(IsQueueEmpty(q2) == 0)        {            EnQueue(q1, DeQueue(q2));        }        return tmp;    }}
0 0
原创粉丝点击