zoukankan      html  css  js  c++  java
  • 队列的基本操作

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

    一、队列的链式存储

    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;    
    }
  • 相关阅读:
    java 支付宝即时到帐提交订单dome
    C#字符串string的常用使用方法(转载)
    UltraEdit 回车符替换空格
    java 七牛上传图片到服务器(采用的html5 压缩 传输base64方式)
    c# 多播委托
    c# 泛型委托
    c# 求数组的最大值
    c# 匿名函数和lamda表达式语法
    匿名函数和lamda表达式
    导出Excel之Epplus使用教程4(其他设置)
  • 原文地址:https://www.cnblogs.com/geziyu/p/9938905.html
Copyright © 2011-2022 走看看