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;    
    }
  • 相关阅读:
    Teched最后两天下载,同时新加熊老的teched录像,请尽快下载。
    如何学习,牛人是否真牛?
    为什么我的脚本大多是支持IE环境
    SPS中提供的Blog
    teched2004最后一天下载,新增js的menu1.0下载
    asp+xml+js所作的文件管理器,完全仿xp风格,精彩下载不要错过。
    将业务系统数据库的数据显示在页面上并且作WebPart的跨页面连接
    Activity中UI框架基本概念
    Android学习笔记——Activity的启动和创建
    Mms模块ConversationList流程分析(2)
  • 原文地址:https://www.cnblogs.com/geziyu/p/9938905.html
Copyright © 2011-2022 走看看