队列

队列(queue):插入和删除在不同端进行的线性表。

队尾(rear):添加新元素的一端。

队首(front):删除元素的一端。

时间有序表:先进先出(FIFO) 特征的线性结构。

队空:

front=0;

rear=-1;

插入A元素:

front=0;

rear=0;

队列满:

rear=MaxSize-1

空队列:front==rear;

入队列:sq[++rear]=x;

出队列:x=sq[++fromt];

当front!=-1时,存在假溢出;

解决队列溢出的方法:

循环队列
基本思想:把队列设想成环形,让sq[0]接在sq[mSize-1]之后
队列的大小为M,若rear+1==M,则令rear=0;
入队: rear=(rear+1)%mSize; sq[rear]=x;
出队: front=(front+1)%mSize; x=sq[front];
队空:front==rear
队满:(rear+1)%mSize==front
队中结点的个数:(rear-front+mSize)%mSize
#include<iostream>
using namespace std;
class arrQueue{
private:
	int mSize;
	int front;
	int rear;
	int *st;
public:
	arrQueue(int size){
		mSize=size+1;          //浪费一个存储空间以区别空队列和满队列
		front=rear=0;
		st=new int[mSize];
	}
	~arrQueue(){ delete[]st;}
	void clear(){ front=rear; }
	bool enQueue(int item);
	bool deQueue(int & item);
	bool getFront(int & item);
	void show();
};
void arrQueue::show(){
	if (front==rear)
	{
		cout<<"空栈!!!\n";
	}
	else{
		int k=(rear-front+mSize)%mSize;
		int j=front;
		cout<<"此队列为:\n";
		for (int i=0;i<k;i++)
		{
			cout<<st[j]<<endl;
			j=(j+1)%mSize;
		}
	}
}
bool arrQueue::getFront(int & item){
	if (front==rear)
	{
		cout<<"空栈,无法取出!!!\n";
		return false;
	}
	item=st[front];
	return true;
}
bool arrQueue::deQueue(int & item){
	if (front==rear)
	{
		cout<<"空栈,无法进行删除\n";
		return false;
	}
	item=st[front];
	front=(front+1)%mSize;
	return true;
}
bool arrQueue::enQueue(int item){
	if ((rear+1)%mSize==front)
	{
		cout<<"队列已满,不能入队列!!!"<<endl;
		return false;
	}

	st[rear]=item;
	rear=(rear+1)%mSize;//注意在循环队列中,rear指向的是空,而不是最后一个
	return true;
}
int main(){
	arrQueue a(3);
	a.enQueue(1);
	a.enQueue(2);
	a.enQueue(3);
	a.enQueue(4);
	a.show();
	int temp=0;
	a.deQueue(temp);
	cout<<temp<<endl;
	a.getFront(temp);
	cout<<temp<<endl;
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值