zoukankan      html  css  js  c++  java
  • 纯C语言实现顺序队列

    #include <stdio.h>
    #include <stdlib.h>
    #define MAXSIZE 6
    
    typedef int QElemType;
    
    typedef struct {
        QElemType *base;
        int front;
        int rear;
    }SqQueue;
    
    SqQueue *InitQueue(SqQueue* Q);//初始化
    SqQueue *DestroyQueue(SqQueue* Q);//销毁
    void ClearQueue(SqQueue *Q);//清空
    int QueueEmpty(SqQueue *Q);//判空
    int QueueLength(SqQueue *Q);//队列长度
    QElemType GetHead(SqQueue *Q);//获取队头元素
    int EnQueue(SqQueue *Q, QElemType e);//插入新元素到队尾
    int DeQueue(SqQueue *Q, QElemType *e);//删除队头元素
    void QueueTraverse(SqQueue *Q);//遍历
    
    //初始化
    SqQueue *InitQueue(SqQueue* Q){
        Q = (SqQueue *)malloc(sizeof(SqQueue));
        Q->base = (QElemType *)malloc(sizeof(QElemType)*MAXSIZE);
        if(!Q->base){
            printf("空间不足,初始化失败
    ");
            return NULL;
        }
        Q->front=Q->rear=0;
        printf("初始化成功
    ");
        return Q;
    }
    
    //销毁
    SqQueue *DestroyQueue(SqQueue* Q){
        free(Q->base);
        free(Q);
        printf("销毁成功
    ");
        return NULL;
    }
    
    //清空
    void ClearQueue(SqQueue *Q){
        int i=Q->front;
        while(i%MAXSIZE != Q->rear){
            printf("%d被清空
    ",Q->base[i%MAXSIZE]);
            Q->base[i%MAXSIZE] = 0;
            i++;
        }
        printf("清空成功
    ");
    }
    
    //判空,1为空
    int QueueEmpty(SqQueue *Q){
        return(Q->rear == Q->front);
    }
    
    //返回队列长度
    int QueueLength(SqQueue *Q){
        return (Q->rear-Q->front+MAXSIZE)%MAXSIZE;
    }
    
    //获取队头元素
    QElemType GetHead(SqQueue *Q){
        if(Q->front != Q->rear){
            printf("队头元素是%d
    ", Q->base[Q->front]);
            return Q->base[Q->front];
        }else{
            printf("空队列,无队头
    ");
        }
    }
    
    //插入新元素到队尾,返回是否入队成功的状态
    int EnQueue(SqQueue *Q, QElemType e){
        //判定是否还有一个空
        if((Q->rear+1)%MAXSIZE == Q->front){
            printf("队列已满,%d元素入队失败
    ",e);
            return 0;
        }
        Q->base[Q->rear] = e;
        //插入后尾指针加一
        Q->rear = (Q->rear+1)%MAXSIZE;
        printf("%d入队成功
    ", e);
        return 1;
    }
    
    //删除队头元素
    int DeQueue(SqQueue *Q, QElemType *e){
        //判空
        if(Q->front==Q->rear){
            printf("空队列,删除失败
    ");
            return 0;
        }
        *e = Q->base[Q->front];
        Q->front=(Q->front+1)%MAXSIZE;
        printf("%d元素出队成功
    ", *e);
        return 1;
    }
    
    //遍历
    void QueueTraverse(SqQueue *Q){
        if(QueueEmpty(Q)){
            printf("空队列
    ");
            return;
        }
        int i=Q->front;
        //只要不等于尾指针就一直遍历
        while(i%MAXSIZE != Q->rear){
            printf("%d ",Q->base[i%MAXSIZE]);
            i++;
        }
        printf("
    ");
    }
    
    int main(void)
    {
        SqQueue *Q = NULL;
        QElemType e = NULL;
        //初始化测试
        Q = InitQueue(Q);
    
        //遍历测试
        QueueTraverse(Q);
    
    //    //入队测试
    //    EnQueue(Q, 1);
    //    EnQueue(Q, 2);
    //    EnQueue(Q, 3);
    //    EnQueue(Q, 4);
    //    QueueTraverse(Q);
    
    //    //长度测试
    //    printf("队列长度为%d
    ",QueueLength(Q));
    //    EnQueue(Q, 1);
    //    EnQueue(Q, 2);
    //    EnQueue(Q, 3);
    //    EnQueue(Q, 4);
    //    printf("队列长度为%d
    ",QueueLength(Q));
    //    EnQueue(Q, 5);
    //    EnQueue(Q, 6);
    //    printf("队列长度为%d
    ",QueueLength(Q));
    
    //    //出队测试
    //    DeQueue(Q, &e);
    //    printf("测试e是否改变:%d
    ",e);
    //    QueueTraverse(Q);
    
    //    //获取队头元素测试
    //    e = GetHead(Q);
    //    EnQueue(Q, 999);
    //    e = GetHead(Q);
    
    //    //出入测试
    //    EnQueue(Q, 1);
    //    EnQueue(Q, 3);
    //    EnQueue(Q, 5);
    //    EnQueue(Q, 7);
    //    EnQueue(Q, 9);
    //    EnQueue(Q, 11);
    //    QueueTraverse(Q);
    //    DeQueue(Q, &e);
    //    DeQueue(Q, &e);
    //    DeQueue(Q, &e);
    //    QueueTraverse(Q);
    //    EnQueue(Q, 7);
    //    EnQueue(Q, 9);
    //    EnQueue(Q, 11);
    //    EnQueue(Q, 13);
    //    QueueTraverse(Q);
    
    //    //清空测试
    //    EnQueue(Q, 7);
    //    EnQueue(Q, 9);
    //    EnQueue(Q, 11);
    //    EnQueue(Q, 13);
    //    ClearQueue(Q);
    //    QueueTraverse(Q);
    
        //销毁测试
        EnQueue(Q, 7);
        EnQueue(Q, 9);
        EnQueue(Q, 11);
        EnQueue(Q, 13);
        Q = DestroyQueue(Q);
        QueueTraverse(Q);
    
    
    
        return 0;
    }
    作者:PowerZZJ
    本博客文章大多为原创,转载请请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势
    在ROS系统下,获取tango的RGBD信息和Pose信息
    ubuntu更改源为aliyun的源;ROS改为新加坡源
    PCL学习(五)如何在mesh模型上sample更多点及三维物体姿态估计
    利用StringBuffer向字符串特定的重复子字符串插入数据
    poi做Excel数据驱动,支持.xls和.xlsx格式的excel文档,比起jxl强大不少
    selenium grid的使用与配置
    maven下载,安装与eclipse中maven配置
    Webdriver实现对菜单栏的灵活切换功能,附上代码,类似的菜单栏切换可以自己封装
    Webdriver控制翻页控件,并实现向前向后翻页功能,附上代码,仅供参考,其他类似日期控件的功能可以自己封装
  • 原文地址:https://www.cnblogs.com/powerzzjcode/p/10889119.html
Copyright © 2011-2022 走看看