zoukankan      html  css  js  c++  java
  • 【数据结构】队列

    队列

    1. 定义
      队列(Queue):具有一定操作约束的线性表
      插入和删除操作:只能在一端插入,而在另一段删除

    数据插入:入队
    数据删除:出队
    先来先服务
    先进先出:FIFO

    1. ADT队列
    类型名称:队列(Queue)
    数据对象集:一个有0个或多个元素的有穷线性表
    操作集:长度为MaxSize的队列Q in Queue,队列元素item in Element
    (1)Queue CreatQueue(int MaxSize):生成长度为MaxSize的空队列
    (2)int IsFull(Queue Q,int MaxSize):判断队列Q是否已满
    (3)void AddQ(Queue Q,ElementType item):将元素加入到队列
    (4)int IsEmpty(Queue Q):判断队列Q是否为空
    (5)ElementType DeleteQ(Queue Q):将队头数据元素从队列中删除并返回
    

    队列的顺序存储实现

    队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front和一个记录队尾元素位置的变量rear组成

    #define MaxSize <元素个数>
    struct QNode{
        ElementType Data[MaxSize];
        int rear;
        int front;
    };
    typedef struct QNode *Queue;
    

    循环队列

    问题:front==rear无法判断出是满还是空(长度为MaxSize,有MaxSize+1种情况,而front和rear的差值只有MaxSize种)
    解决方法:(1)增加Size或tag域(2)只加入MaxSize-1个元素(采用)

    1.入队列

    void AddQ(Queue PtrQ,ElementType item){
        if((PtrQ->rear+1)%MaxSize==PtrQ->front){
            cout<<"队满";
            return;
        }else{
            PtrQ->rear=(PtrQ->rear+1)%MaxSize;
            PtrQ->Data[PtrQ->rear]=item;
            return;
        }
    }
    
    1. 出队列
    ElementType DeleteQ(Queue PtrQ){
        if(PtrQ->front==PtrQ->rear){
            cout<<"队列空";
            return ERROR;
        }
        else{
            PtrQ->front=(PtrQ->front+1)%MaxSize;
            return PtrQ->Data[PtrQ->front];//这里注意,front指向的是队列的前一个元素,所以直接return掉front当前指的那个元素就好了
    }
    

    队列的链式存储实现

    可以用单链表实现。插入和删除操作分别在链表的两头进行。front在表头,rear在表尾

    struct Node{    
        ElementType Data;    //单链表节点
        struct Node *Next;
    }
    struct QNode{            //这样定义还挺有意思,指向头和尾的两个节点就是一个队列啦
        struct Node *rear;
        struct Node *front;
    };
    typedef struct QNode *Queue;
    Queue PtrQ;
    

    (1)出队操作

    ElementType DeleteQ(Queue PtrQ){
        struct Node *FrontCell;//需要将首节点找出来,方便释放掉其内存,防止内存泄漏
        ElementType FrontElem;//因为要返回元素,所以定义这个东西自然而然
    
        if(PtrQ->front==NULL){
            cout<<"队列为空";
            return NULL;
        } else{
            FrontCell=PtrQ->front; //需要判断是否只有一个,一个和多个是不一样的哦
            if(PtrQ->front==PtrQ->rear)//FrontCell->Next==NULL不行。
                PtrQ->front=PtrQ->rear=NULL;
            else
                   PtrQ->front=FrontCell->Next;
            FrontElem=FrontCell->Data;
            free(FrontCell);
            return FrontElem; 
          }
    
    }
    

    (2)入队操作

    void AddQ(ElementType item, Queue PtrQ){
        struct Node *TmpCell;
        TmpCell=(struct Node*)malloc(sizeof(struct Node));
        TmpCell->Data=item;//先创建一个临时节点用来存储插入的元素
    
        if(PtrQ->front==NULL){//如果为空队列
            PtrQ->front=PtrQ->rear=TmpCell;
            return;
        }else{//队列不为空
            PtrQ->rear->Next=TmpCell;
            return;
        }  
    }
    

    多项式的加法运算

    struct PolyNode{
        int coef;
        int expon;
        struct PolyNode *link;
    };
    typedef struct PolyNode *Polynomial;
    Polynomial P1,P2;
    
  • 相关阅读:
    学习Mybatis与mysql数据库的示例笔记
    SpringAOP学习笔记
    idea开发ssh(Spring+struts+Hibernate)实现对MySQL数据库的增删改查
    springmvc加vue实现前后端数据的跨域访问
    idea开发工具springmvc加vue.js实现MySQL数据库的查询操作
    利用idea开发工具实现ssh(spring+struts+hibernate)加vue.js前后台对数据库的查询
    appweb 7.0.2版本编译
    Unable to register the DLL/OCX: RegSvr32 failed with exit code 0x3 我的解决方法
    无法定位程序输入点 InitializeCriticalSectionEx 于动态链接库 Kernel32.dll 上 问题解决方法
    海思3516D + IMX291图像闪烁问题定位
  • 原文地址:https://www.cnblogs.com/maxwell-maxwill/p/12312706.html
Copyright © 2011-2022 走看看