• 队列的基本操作


    队列即可以用链表实现也可以用顺序表实现,跟栈相反的是,栈一般用顺序表实现而队列用链表来实现,简称为链队列,我们将队头指针指向链队列的头结点,队尾指针指向终端结点(头结点不是必要的,但为了方便操作我们加上了头结点)。

    一、队列的链式存储

    1、链队列的存储结构

    //队列的存储结构
    typedef struct QNode{
        ElemType data;
        struct QNode *next;
    }QNode,*QueuePtr;
    
    typedef struct{
        QueuePtr front; //队头指针 
        QueuePtr rear; //队尾指针 
    }LinkQueue;

     2、初始化一个队列

    创建一个队列要完成两个任务,一是在内存中创建一个头结点,二是将队列的头指针和头结点指向这个生成的头结点,此时是空队列

    //创建一个队列
    Status InitQueue(LinkQueue &q){
        q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
        if( !q->front )
            exit(0);
        q->front->next = NULL;
        return OK;
    } 

    3、入队操作

    //入队操作
    Status InsertQueue(LinkQueue &q, ElemType e){
        QueuePtr p;
        p = (QueuePtr)malloc(sizeof(QNode));
        if( p == NULL )
            exit(0);
        p->data = e;
        p->next = NULL;
        q->rear->next = p;
        q->rear = p;
        return OK;
    }

    4、出队操作

    //出队操作
    Status DeleteQueue(LinkQueue &q, ElemType &e){
        QueuePtr p;
        if(q->front == q->rear)
            return ERROR;
        p = q->front->next;
        e = p->data;
        q->front->next = p->next;
        if( q->rear == p )
            q->rear = q->front;
        free(p);
        return OK;
    }

    5、销毁一个队列

    //销毁一个队列
    DestroyQueue(LinkQueue &q){
        while( q->front ){
            q->rear = q->front->next;
            free(q->front);
            q->front = q->rear;
        }
        return OK;
    }

    二、队列的顺序存储

    1、定义一个循环队列

    //定义一个循环队列
    #define MAXSIZE 100
    typedef struct{
        ElemType *base; //用于存放内存分配基地址
        int front;
        int rear; 
    }; 

    2、初始化循环队列

    //初始化循环队列
    Status InitQueue(SqQueue &q){
        q->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
        if( !q->base )
            exit(0);
        q->front = q->rear = 0;
        return OK;
    } 

    3、入队操作

    //入队列操作
    Status InsertQueue(SqQueue &q,ElemType e){
        if( (q->rear+1)%MAXSIZE == q->front )
            return ERROR;  //队满
        q->base[q->rear] = e;
        q->rear = (q->rear+1)%MAXSIZE;
        return OK; 
    }

    4、出队操作

    //出队操作
    Status DeleteQueue(SqQueue &q,ElemType &e){
        if(q->front = q->rear)
            return ERROR;
        e = q->base[q->front];
        q->front = (q->front+1)%MAXSIZE;
        return OK;    
    }
  • 相关阅读:
    substring(x)和substring(x,y)的用法
    js 判断字符串中是否包含某个字符串
    js如何将纯数字字符串转换为long型
    union和union all的区别
    JavaScript 中 var 和 let 和 const 关键字的区别
    JS操作文件
    java 字符串和集合互相转换
    关于sql中in 和 exists 的效率问题,in真的效率低吗
    sql 同一张表查询不同数据合并之后关联查询
    Android input输入框 移动页面input手机键盘中的“搜索”按键
  • 原文地址:https://www.cnblogs.com/geziyu/p/9938905.html
Copyright © 2020-2023  润新知