顺序队列模板

全部数据结构、算法及应用课内模板请点击:https://blog.csdn.net/weixin_44077863/article/details/101691360

队列分为顺序队列和链式队列,按是否循环又有循环队列

(其实我觉得分成普通队列、双端队列、优先队列才靠谱嘛QAQ)

顺序循环队列模板如下:(书上直接就是循环队列模板,因为不循环的话其实问题很大)

(不循环只要进出加一起总共存过maxSize个就不能再存了)

template<class T>
class ArrayQueue{
private:
	int maxSize,front,rear;
    T*queue;
public://多出一个空间,用以区分队列空与满
	ArrayQueue(int size=0):maxSize(size+1),queue(new T[maxSize]),front(0),rear(0){}
	~ArrayQueue(){delete[] queue;}
	void Clear(){front=rear=0;}
	bool IsEmpty(){if(front==rear) return 1;return 0;}
	bool IsFull(){if((rear+1)%maxSize==front) return 1;return 0;}
	bool EnQueue(const T item){
		if((rear+1)%maxSize==front){
			cout<<"队列已满!入队失败!"<<endl;
			return 0;
		}
		queue[rear]=item;
		rear=(rear+1)%maxSize;
		return 1;
	}
	bool DeQueue(T &item){
		if(front==rear){
			cout<<"队列为空!"<<endl;
			return 0;
		}
		item=queue[front];
		front=(front+1)%maxSize;
		return 1;
	}
	bool GetFront(T &item){
		if(front==rear){
			cout<<"队列为空!"<<endl;
			return 0;
		}
		item=queue[front];
		return 1;
	}
};

简单讲一下这个模板吧,教材的这个模板也比较奇葩,看着并没那么清晰,说一下好点

size个元素,定义了maxsize=size+1,为啥这么做呢

首先,这个模板元素下标是(0~size-1),然后rear并不是队尾元素下标,而是队尾元素的后一个位置(可push位置下标)

然后,先来讲个一般人的错误想法

令 size=5 ,于是假设front=0,则rear=0,1,2,3,4均可插入,5不可,于是有人说那就判 rear%size是否==front

那么问题来了,下标0处可以插入吗?你这个错误直接把下标0搞丢了

好,有人说,front、rear是否相等,是否取模相等分开判,就是说一个是 rear=0可插,一个是rear=5,rear%5=0不可插

好,front=2的话,2,3,4,0,1可插入,0个元素 front=rear=2,5个元素 front=rear还是=2,与取模无关了。

于是,完蛋了吧。

所以说,教材上的方法就要上场了,虽然看着挺奇怪,但是是一个完全正确完全准确的做法

它让maxsize=size+1,是否满是判 (rear+1)%maxsize==front,后者还算好理解,前者空间多开一个,很多人认为没必要

具体怎么回事我们来仔细分析下吧

令size=5,maxsize=6,对应下标有0,1,2,3,4,5

若front=0,则rear=0,1,2,3,4均可插入,5不可,判(5+1)%6==0 这个和上面方框里说的差不多

那么front=2时呢?非常巧妙。2,3,4,5,0可插入,1不可插入(1+1)%6==2 解决了之前方框里说的问题

看到这里,或许你会觉得很糊涂,这什么原理?

把0,1,2,3,4和判满位5,六个位置连起来转动就是本质,方框里不行的原因是,判满位几乎可以认为是固定的

所以一旦循环就会出现问题,而教材的方法解决的很巧妙,真的很棒

这时

有人说,那么我rear干脆记录最后一个元素下标,别记后一个了

这个方法问题也很大,front=rear=0那么你现在有一个元素了??

你或许会说rear 初始化 -1吧

那么front=2时,rear=1,这是满了还是空了??

当然,如果你记录当前size的话,直接就能判空满,想咋写咋写,一切问题就都解决了。

但是教材就没记录当前size,他就给解决的,也算是真的很厉害了

值得学习

发布了49 篇原创文章 · 获赞 0 · 访问量 1723

猜你喜欢

转载自blog.csdn.net/weixin_44077863/article/details/101996045