数据结构------队列

C++数据结构:队列

和栈一样,是特一种特殊的线性表(限制版本 的线性表),先进新出的数据结构。普通队列中的数据从队头离开之后,那么队头离开后的内存空间就被剩下了,导致内存利用率降低。环形队列就可以解决这个问题。

队列和栈一样是一种线性结构,其底层基础都是线性数组和链表,基于数组队列的缺点是由于一端插入一端删除,当不断从头部删除数据,头部会大量留有空闲内存,无法插入,造成空间流失,如果将队头指针在每次删除之后往前移动一个位置,这是一个时间复杂度为O(n)的操作.为解决这个要么空间浪费要么时间浪费的问题,使用循环队列,所谓循环队列,是将一个数组看出首尾相连的圆环,删除元素时将队首标志往后移动,添加元素时若数组尾部已经没有空间,则考虑数组头部的空间是否空闲,如果是,则在数组头部插入

环形队列在头部删除,在尾部插入,删除和插入方向都是顺时针的。

                    

抽象数据类型 queue
{
    实例
        元素的有序表,一端称为队首,另一端称为队尾
    操作
        empty():
        size():
        front();//返回队首元素
        back();//返回队尾元素
        pop();//删除队首元素
        push(x);//把元素x假如到队尾
};

1、主要操作

2、分类

(1)数组描述:

(2)链表描述:

3、主要的问题

(1)如何判断队列空、满

队空:begin == end=0;

队满:begin == (end+1)%length;

(2)队头、队尾的位置

队头:begin = begin % length;

队尾:end = end % length;

总结队列中要解决的问题:

1)求元素的个数:(end-begin+length) % length

2)begin /end 指向逻辑的下一个空间  begin =(begin +1)%length,end = (end +1)%length

  3)判空:begin == end =0;

4)判满:(end +1)%length== begin

4、C++实现队列(数组队列)

#include <iostream>
#include <string>
using namespace std;

template<class T>
class LoopQueue
{
private:
	T* queue;
	int length;
	int begin;
	int end;

public:
	LoopQueue(int c = 10);
	~LoopQueue();

	bool isEmpty();
	int size();
	bool push(T t);//在队首入队
	bool pop();//队尾元素出队
	T front();//队首元素
	T back();//队尾元素
	bool fullqueque();//判断是否队满

};
template<class T>
LoopQueue<T>::LoopQueue(int c = 10)
{
	length = c;
	begin = 0;
	end = 0;
	queue = new T[length];
}

template<class T>
LoopQueue<T>::~LoopQueue()
{
	delete[] queue;
}
template<class T>
bool LoopQueue<T>::isEmpty()
{
	if (begin == end)
		return true;
	return false;
	
}

template<class T>
int LoopQueue<T>::size()
{
	return (end - begin + length) % length;
}
template<class T>
T LoopQueue<T>::front()
{
	if (begin == end)
		return false;
	return queue[begin];
}
template<class T>
T LoopQueue<T>::back()
{
	if (end == begin)
		return false;
	return queue[end];
}
template<class T>
bool LoopQueue<T>::fullqueque()
{
	if ((end + 1) % length == begin)
		return true;
	else
		return false;
}
template<class T>
bool LoopQueue<T>::push(T t)
{

	if (fullqueque())
	{
		//有必要的话加上增加数组容量的代码
	}
	else
	{
		queue[end] = t;
		end = (end + 1) % length;
		return true;
	}

}
template<class T>
bool LoopQueue<T>::pop()
{
	if (!isEmpty())
	{
		begin = (begin + 1) % length;
		//queue[begin].~T();		
		return true;
	}
	return false;
}

int main()
{
	LoopQueue<string> queue(20);
	queue.push("one");
	queue.push("two");
	queue.push("three");
	queue.push("four");
	queue.push("five");
	cout << "队列长度" << queue.size() << endl;
	while (!queue.isEmpty())
	{
		cout<<queue.front() << endl;
		queue.pop();
	}
	queue.push("shishi");
	cout << endl << queue.front() << endl;
	//getchar();
	//system("pause");
	return 0;
}

队列的链表描述:

从头至尾的链接方式有利于删除操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值