• 顺序队列的C语言实现


    #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 /* 存储空间初始分配量 */

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

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

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

    /* 初始化一个空队列Q */
    Status InitQueue(SqQueue *Q)
    {
    Q->front=0;
    Q->rear=0;
    return OK;
    }

    /* 将Q清为空队列 */
    Status ClearQueue(SqQueue *Q)
    {
    Q->front=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;
    }

    /* 从队头到队尾依次对队列Q中每个元素输出 */
    Status QueueTraverse(SqQueue Q)
    {
    int i;
    i=Q.front;
    while((i+Q.front)!=Q.rear)
    {
    visit(Q.data[i]);
    i=(i+1)%MAXSIZE;
    }
    printf(" ");
    return OK;
    }

    int main()
    {
    Status j;
    int i=0,l;
    QElemType d;
    SqQueue Q;
    InitQueue(&Q);
    printf("初始化队列后,队列空否?%u(1:空 0:否) ",QueueEmpty(Q));

    printf("请输入整型队列元素(不超过%d个),-1为提前结束符: ",MAXSIZE-1);
    do
    {
    /* scanf("%d",&d); */
    d=i+100;
    if(d==-1)
    break;
    i++;
    EnQueue(&Q,d);
    }while(i<MAXSIZE-1);

    printf("队列长度为: %d ",QueueLength(Q));
    printf("现在队列空否?%u(1:空 0:否) ",QueueEmpty(Q));
    printf("连续%d次由队头删除元素,队尾插入元素: ",MAXSIZE);
    for(l=1;l<=MAXSIZE;l++)
    {
    DeQueue(&Q,&d);
    printf("删除的元素是%d,插入的元素:%d ",d,l+1000);
    /* scanf("%d",&d); */
    d=l+1000;
    EnQueue(&Q,d);
    }
    l=QueueLength(Q);

    printf("现在队列中的元素为: ");
    QueueTraverse(Q);
    printf("共向队尾插入了%d个元素 ",i+MAXSIZE);
    if(l-2>0)
    printf("现在由队头删除%d个元素: ",l-2);
    while(QueueLength(Q)>2)
    {
    DeQueue(&Q,&d);
    printf("删除的元素值为%d ",d);
    }

    j=GetHead(Q,&d);
    if(j)
    printf("现在队头元素为: %d ",d);
    ClearQueue(&Q);
    printf("清空队列后, 队列空否?%u(1:空 0:否) ",QueueEmpty(Q));
    return 0;
    }

  • 相关阅读:
    Ckeditor(4.5.5) language 语言切换
    利用array_slice进行手动分页
    PHP API 接口访问之签名验证
    mysql外键的一些总结
    缺货置顶功能(类似功能可参考)
    [Exchange2013] 无法正常发送存入草稿箱 或者 只能发不能收
    [Exchange]2个不同域之间互发邮件
    [Citrix NetScaler] 简述
    [转载] cookie、JS记录及跳转到页面原来的位置
    [XenServer] XenServer修改IP 以及 root密码
  • 原文地址:https://www.cnblogs.com/nku-wangfeng/p/7631175.html
Copyright © 2020-2023  润新知