vip解析网站如何做/怎么快速推广自己的产品
非传统队列
- 原理
- 实现
原理
与传统队列不同,我想到新的一种方法来实现队列。其核心在于队头和队尾数值的改变。并且也不需要牺牲空间,只是多出了几次判断。
核心问:
- 什么时候队列会变为空?
- 什么时候队列会满?
(1) 只在出队的时候,才会出现队列为空的情况。不可能出现队列为满。此时我们只需要判断队头和队尾是否相等了就可,如果相等那便意味着队列已经空了。此时我们可以把队头和队尾赋值为-1.这样做是为了在以后判断队列为空时提供方便。
(2)只有在进队的时候才会出现队满的情况。此时我们不会做任何操作。但我们知道如果此时队列为满的话:队头等于队尾。
核心法门:我们判断队列为满和队列为空的时候,都会出现判断是队头和队尾相等。但我们无法知道此时到底是队满了还是队空了。
此时请想起我们在出队时做的方法。我们设了这样的机关,只要队空便要赋值队头和队尾为 -1.
所以队空的情况有个额外的条件:队头和队尾皆为 -1。
那么判断队列满的情况再加个额外条件:队尾不为 -1。
最容易失误的地方:但也有个遗漏的地方,那便是刚开始的时候直接把队列给装满了。此时队头是 -1。队尾是 队列长度减一。这也是为什么在上面判断队列为满的情况时额外条件没有队头也是 -1 的答案。所以判断队列是否为满的情况时我们有两个额外的条件。
实现
//新型队列#include <iostream>
const int size = 10;
using namespace std;class Queue{public:Queue(){front = -1;rare = -1;}bool IsEmpty();bool IsFull();void InQueue(int);int DeQueue();void Clear();int GetFront();private:int front;int rare;int data[size];
};int Queue::GetFront()//返回队头
{if(!IsEmpty()){//非空的情况下才能返回 int temp = (front+1)%size;return data[temp];}return -1;
}void Queue::Clear()
{front = -1;rare = -1;
}int Queue::DeQueue()//出队
{if(!IsEmpty()){//非空的情况下才能出队 front = (++front)%size;int temp = data[front];if(front == rare){//此时此刻队列已经是空的了 Clear(); //此函数为清空函数 }return temp;}return -1;} void Queue::InQueue(int x)//进队
{if(!IsFull()){//非满的时候 rare = (++rare)%size;//因为队列是环形的 data[rare] = x;}else{cout<<"Queue is full"<<endl;} } bool Queue::IsFull()//判断队列是否已满
{if((front == rare && rare != -1)||(front == -1 && rare == size-1)){//判断队列是否满时有两个情况 return true;}return false;
}bool Queue::IsEmpty()//判断队列是否为空
{if(front == rare && rare == -1){return true;}return false;
}int main(void)
{Queue que;//测试 //que.InQueue(2);//cout<<que.DeQueue()<<" ";//cout<<que.DeQueue()<<' ';//que.InQueue(3);//que.Clear();//if(que.IsEmpty())cout<<"jk"<<endl;return 0;}
视频.