队列:
特点有:
1.先进先出,即尾进头出(或相反)
2.两个下标,一个表示头一个表示尾
3.本质也还是数组
注意点:
1.假溢出问题,如图所示,尾下标到顶不能再加,但下面还有储存位置
解决办法:
一:固定队头或队尾,出队或入队时移动元素,保证队头或队尾一直在底部或顶部
二:循环队列(本文采用的的方法)
循环队列带来的问题:
无论时队空还是队满,都会有front == rear ,
以及rear,front实现循环的具体方法
解决方案:
1.引入计数变量counter,当counter == maxsize的时候,表示满,counter == 0的时候表示空,缺点是出入队时要记得对counter进行处理
2.约定(rear+1)%maxsize == front(即约定只空一个位置的时候为队满),本文方法
3.加一个判断标志,例如标志变量flag=0,如果元素入队列导致rear==front,flag置1,元素出列导致 rear ==front 时,flag置0,所以后面当front == rear时,可以判断flag来判断是否满队
4.具体方法。当rear,front 下标到maxsize时,对它(%maxsize)就可以再从0开始,达到循环效果
#include<bits/stdc++.h>
using namespace std;
const int maxsize = 3;
class queuee
{
int rear, front;
int a[maxsize];
public:
queuee()
{
rear = front = 0;
}
void enqueue(int x)
{
if (!is_full())
{
a[rear] = x;
rear = (rear + 1) % (maxsize);
}
else
{
cout << "队伍满了,不能进队";
}
}
int dequeue()
{
if (is_empty())
{
cout << "队伍为空,不能出队";
exit(0);
}
else
{
int b = a[front];//提前保存值,return a[front-1]不一定对,因为是循环的
front = (front + 1) % (maxsize);
return b;
}
}
bool is_full()
{
return (rear + 1) % (maxsize) == front;
}
bool is_empty()
{
return front == rear;
}
};
int main()
{
queuee a;
int x, y = 2;
while (y--)
{
cin >> x;
a.enqueue(x);
}
cout << a.dequeue();
cin >> x;
a.enqueue(x);
cout << a.dequeue();
}