队列 和 循环队列

队列也是一种运算受限制的线性表,它只允许在表的一端进行插入,而另外一段只允许进行删除。

允许删除的一端称为队头(Front);允许删除的一端称为队尾(Rear)。

顺序队列实际上是受限的顺序表,和顺序表一样,顺序队列也必须采用一个数组来存放当前数据元素。

当队尾(Rear)达到 最大位置时(Maxsize)。 表示此时空间不足,已经不能在入队了。但是随着我们出队Front 向前移动, (0~Front) 的空间是剩余的。 我们称这种现象为假上溢。

为了克服假上溢现象:我们讲队列的头尾连起来形成一个环(循环队列), (即 原来 -1 的位置就是现在 Maxsize -1 的位置)

循环队列每次移动思路:

每次移动 Rear = (Rear +1)%Maxsize;

每次移动Front = (Front +1)%Maxsize;

 

顺序队列

#include<iostream>
#include<cstdio>
using namespace std;
const int Maxsize=1000;
typedef struct node{
    int data[Maxsize];
    int Front,Rear;///头指针和尾指针,分别指向队头和队尾
}*Sq;
void Init_Sequeue(Sq &Q){
     Q->Front=-1;
     Q->Rear=-1;
}
int Out_Queue(Sq &Q){///获取队头元素
   if(Q->Front>=Q->Rear)
    cout<<"Queue id NULL"<<endl;
   else
   {
       Q->Front++;
       return Q->data[Q->Front];
   }
}
void In_Queue(Sq &Q,int e){///入队
   if(Q->Rear>=Maxsize-1)
    cout<<"Queue is overfloor"<<endl;
   else{
    Q->Rear++;
    Q->data[Q->Rear]=e;
   }
}
int main(){
     Sq Q=(Sq)malloc(sizeof(Sq));
     Init_Sequeue(Q);
     int n,i;
     cin>>n;///入队5个数
      for(i=1;i<=n;i++)
        In_Queue(Q,i);
    cout<<"出队序列:";
     for(i=1;i<=n;i++)
        cout<<Out_Queue(Q)<<" ";
    return 0;
}

 

循环队列(顺序存储)

#include<iostream>
#include<cstdio>
using namespace std;
const int Maxsize = 1000;
typedef struct node{
   int data[Maxsize];
   int Front,Rear;
}*Sq;
void Init_Queue(Sq &Q){///置空循环队列
    Q->Front=Maxsize-1;
    Q->Rear=Maxsize-1;
}
bool is_Empty(Sq Q){///判空
  if(Q->Front==Q->Rear)
         return true;
     else
    return false;
}
void In_Queue(Sq &Q,int e){///入队
    if(Q->Front==((Q->Rear+1)%Maxsize)){///队以满,上溢; 在移动 Front 以前判断之前的尾巴Rear 在移动一个是不是队为,如果是,这表是满了
     cout<<"Queue is overfloor"<<endl;
    }
    else{
        Q->Rear=(Q->Rear+1)%Maxsize;///
        Q->data[Q->Rear]=e;
    }
}
int  Out_Queue(Sq &Q){///出队
    if(is_Empty(Q))
        cout<<"Queue is underfloor"<<endl;
    else
        Q->Front=(Q->Front+1)%Maxsize;
        return Q->data[Q->Front];
}
int GET_head_Queue(Sq Q){///获取当前对头元素
     if(is_Empty(Q))
       {
            cout<<"Queue is NULL"<<endl;
       }
    else{
         int id=(Q->Front+1)%Maxsize;
        return Q->data[id];
    }
}
int main()
{
    Sq Q=(Sq)malloc(sizeof(Sq));
    Init_Queue(Q);
    int n,i;
    cin>>n;
    for(i=1;i<=n;i++)
    In_Queue(Q,i);
    cout<<"获取当前队头元素:"<<GET_head_Queue(Q)<<endl;
    cout<<"依次出队:"<<endl;
    for(i=1;i<=n;i++)
    cout<<Out_Queue(Q)<<" ";
    cout<<endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值