• 数据结构躬行记3_循环队列&链式队列及其基本操作(c++实现)


    循环队列

    概念

    队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的一端为队尾(入队),允许删除(出队)的一端为队头。

    要点

    顺序存储的队列是采用数组来实现的,但由于数组是静态的,在队列的出队和入队的操作下会出现整个队列后移逐渐占用下标加大位置而下标较小位置为空的“假溢出”现象,所以采用了将存储队列的数组看成是头尾相接的循环结构,即允许队列直接从数组的下标最大的位置延续到下标最小的位置。

    队空:q.rear=q.front

    队满:(q.rear+1)%size==q.front

    代码实现

    #include<iostream>
    using namespace std;
    #define MAXSIZE 100
    typedef struct
    {
        int *base;
        int front;
        int rear;
    }SqQuene;
    
    //创建一个队列
    void createQuene(SqQuene &Q)
    {
        Q.base = new int[MAXSIZE];
        if(Q.base == NULL)
            return ;
        Q.front = Q.rear =0;
    }
    //求队列的长度
    int length(SqQuene Q){
        return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
    }
    
    //入队
    void EnQuene(SqQuene &Q)
    {
        cout<<"*****************入队操作*****************"<<endl;
        cout<<"请输入入队个数:"<<endl;
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
          if((Q.rear+i)%MAXSIZE == Q.front)
        {
            cout<<"此队列空间不足!"<<endl;
            return ;
        }
        }
        for(int i=0;i<n;i++)
        {
            int in;
          cout<<"请输入第"<<i+1<<"个入队数:";
          cin>>in;
          Q.base[Q.rear] = in;
          Q.rear = (Q.rear+1)%MAXSIZE;
        }
    
    }
    //出队
    void DeQuene(SqQuene &Q)
    {
        cout<<endl;
        cout<<"*****************出队操作*****************"<<endl;
        cout<<"请输入出队个数:"<<endl;
        int n;
        cin>>n;
        if(Q.rear == Q.front)
        {
            cout<<"此队列是空队列!"<<endl;
            return;
        }
    
        Q.front = (Q.front+n)%MAXSIZE;
    
    }
    
    //取队头元素
    int gethead(SqQuene  Q)
    {
        if(Q.rear == Q.front)
        {
            cout<<"此队列是空队列!"<<endl;
            return NULL;
        }
        return Q.base[Q.front];
    }
    
    void showQuene(SqQuene Q)
    {
          if(Q.rear == Q.front)
        {
            cout<<"此队列是空队列!"<<endl;
            return ;
        }
        cout<<"此队列为:";
        int pr = Q.front;
        while((pr+1)%MAXSIZE!=Q.rear)
        {
            cout<<Q.base[pr]<<" ";
            pr++;
        }
        cout<<Q.base[pr]<<" ";
    }
    
    int main()
    {
        SqQuene Quene;
        createQuene(Quene);
        EnQuene(Quene);
        showQuene(Quene);
        DeQuene(Quene);
        showQuene(Quene);
    }

    链式队列

    概念

    队列是一种线性结构,和链表不同之处在于队列有两个指针操作,一个是队首指针,一个是队尾指针,节点删除移动队首指针,节点插入移动队尾指针,同时队列具有先进先出的特点,

    要点

    全程要明确指针的指向,指针的解引用和箭头指向,(q.front->next是列队的第一个节点)

     1 typedef struct Node{
     2       int data;
     3       struct Node * next;
     4 }QNode,*Queneptr;
     5 
     6 typedef struct
     7 {
     8     Queneptr  front;
     9     Queneptr rear;
    10 }LinkQuene;

    代码实现

    #include<iostream>
    using namespace std;
    
    typedef struct Node{
          int data;
          struct Node * next;
    }QNode,*Queneptr;
    
    typedef struct
    {
        Queneptr  front;
        Queneptr rear;
    }LinkQuene;
    
    void InitQuene(LinkQuene &q)
    {
        q.front =q.rear =new QNode;
        q.front->next =NULL;
    }
    
    void EnQuene(LinkQuene &q)
    {
        cout<<"*****************入队操作*****************"<<endl;
        cout<<"请输入入队个数:"<<endl;
        int n,i=1;
        cin>>n;
        while(n--)
        {
          int in;
          cout<<"请输入第"<<i<<"个入队数:";
          cin>>in;
          Queneptr p =new QNode;
          p->data = in;
          p->next = NULL;
          q.rear->next = p;
          q.rear = p;
          i++;
        }
        cout<<"入队成功!"<<endl;
    }
    
    void DeQuene(LinkQuene &q)
    {
        cout<<endl;
        cout<<"*****************出队操作*****************"<<endl;
        cout<<"请输入出队个数:"<<endl;
        int n;
        cin>>n;
        while(n--)
        {
            if(q.front ==q.rear)
        {
            cout<<"队列为空!"<<endl;
            return ;
        }
            Queneptr p = new QNode;
            p=q.front->next;
            q.front->next = p->next;
            if(q.rear == p)
            {
                q.rear=q.front;
            }
            free(p);
    
        }
    
    }
    
    int GetHead(LinkQuene q)
    {
        if(q.front!=q.rear)
            return q.front->next->data;
    }
    
    void showQuene(LinkQuene q)
    {
         if(q.rear == q.front)
        {
            cout<<"此队列是空队列!"<<endl;
            return ;
        }
        cout<<"此队列为:";
        Queneptr p = new QNode;
        p = q.front;
        while(p!=q.rear)
        {
            p=p->next;
            cout<<p->data<<" ";
        }
    }
    int main()
    {
       LinkQuene Quene;
       InitQuene(Quene);
       EnQuene(Quene);
       showQuene(Quene);
       DeQuene(Quene);
       showQuene(Quene);
    
      return 0;
    }
  • 相关阅读:
    .sorted关键字进行比较排序
    Groovy
    Java8部分特性及list的常见操作
    小鹅通(公众号)视频下载
    angular webpack发布后如何调试代码
    收缩数据库日志文件
    设计模式 行为型之王 模板方法模式
    nginx 正向代理与反正代理的区别及简单配置
    nginx 基本操作
    Docker Compose安装Nginx和PHP7环境
  • 原文地址:https://www.cnblogs.com/g414056667/p/13660547.html
Copyright © 2020-2023  润新知