• 数据结构躬行记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;
    }
  • 相关阅读:
    Building Java Projects with Gradle
    Vert.x简介
    Spring及Spring Boot 国内快速开发框架
    dip vs di vs ioc
    Tools (StExBar vs Cmder)which can switch to command line window on context menu in windows OS
    SSO的定义、原理、组件及应用
    ModSecurity is an open source, cross-platform web application firewall (WAF) module.
    TDD中测试替身学习总结
    Spring事务银行转账示例
    台式机(华硕主板)前面板音频接口(耳机和麦克风)均无声的解决办法
  • 原文地址:https://www.cnblogs.com/g414056667/p/13660547.html
Copyright © 2020-2023  润新知