数据结构躬行记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;
}
原文地址:https://www.cnblogs.com/g414056667/p/13660547.html