算法(9)队列

        队列是一种先进先出(first in first out)的数据结构,重要的元素有 头,尾, 队列长度。队列的操作基本有四种,验空(isEmpty),验满(isFull),出队(deQueue),入队(enQueue)。

        实现队列有两种方法,数组和链表。这里数组的程序是我自己写的,链表的则是参考《C++ primer plus》六版P471上的代码。

        关于用数组实现队列,可以将数组想象成一个首尾相接的环,head和tail之间的为队列,队列在这个环上移动。

        用数组实现的代码如下:

#include <iostream>

using namespace std;

class Queue
{
	private:
		int head,tail;
		int *q,len;
		//int item;
	public:
		Queue(int);
		~Queue();
		bool isFull() const;
		bool isEmpty() const;
		bool enQueue(int);
		bool deQueue(int &);
		void show() const;
};


/**************************** 以下为类的实现****************************/

Queue::Queue(int _len=10)
{
	head=tail=0;
	len=_len;
	q=new int(len);
}

Queue::~Queue()
{
	delete q;
}

bool Queue::isFull() const
{
	if((head==0&&tail==len-1)||(head==tail+1))
		return true;
	else
		return false;
}

bool Queue::isEmpty() const
{
	if(head==tail)
		return true;
	else
		return false;
}

bool Queue::enQueue(int x)
{
	if(isFull())
		return false;
	else
	{
		q[tail]=x;
		if(tail==len-1)
			tail=0;
		else
			tail++;
	}
}

bool Queue::deQueue(int &x)
{
	if(isEmpty())
		return false;
	else
	{
		x=q[head];
		if(head==len-1)
			head=0;
		else
			head++;
		return true;
	}
}

void Queue::show() const
{
	if(tail>=head)
		for(int i=head;i<tail;i++)
			cout<<q[i]<<" ";
	else
	{
		for(int i=head;i<len;i++)
			cout<<q[i]<<" ";
		for(int i=0;i<tail;i++)
			cout<<q[i]<<" ";
	}
}

//**************************************************

int main()
{
	int x;
	Queue queue(5);
	queue.enQueue(10);
	queue.enQueue(20);
	queue.enQueue(40);
	queue.enQueue(50);
	queue.show();
	queue.deQueue(x);
	cout<<'\n'<<x<<endl;
	queue.show();
	queue.deQueue(x);
	cout<<'\n'<<x<<endl;
	queue.show();
	return 0;
}

        用链表实现如下:

#include <iostream>

using namespace std;

class Queue
{
	private:
		struct Node
		{
			int item;
			struct Node *next;
		};
		enum
		{
			Q_SIZE=10   //默认构造时需要
		};
		Node *head;
		Node *tail;
		int items;  //队列内现有元素的个数 
		const int qsize;//队列的最大长度
		Queue(const Queue &q):qsize(0) 
		{
			
		}  //默认构造长度为0
		Queue & operator=(const Queue & q)  //重载=这个运算符
		{
			return *this;
		}
		
	public:
		Queue(int qs=Q_SIZE);
		~Queue();
		bool isEmpty() const;
		bool isFull() const;
		int queueCount() const;
		bool enQueue(const int & item);
		bool deQueue(int &item);		
};


/**************************** 以下为类的实现****************************/

Queue::Queue(int qs):qsize(qs)
{
	head=tail=NULL;
	items=0;
}

Queue::~Queue()
{
	Node *temp;
	while(head!=NULL)
	{
		temp=head;
		head=head->next;  //从头开始释放每一个节点
		delete temp;
	}
}

bool Queue::isEmpty() const
{
	return items==0;
}

bool Queue::isFull() const
{
	return items==qsize;
}

int Queue::queueCount() const
{
	return items;
}

bool Queue::enQueue(const int &item)
{
	if(isFull())
		return false;
	Node * add=new Node;
	add->item=item;
	add->next=NULL;
	items++;
	
	if(head==NULL)  //队列空
		head=add;
	else
		tail->next=add;
	tail=add;
	return true;
}

bool Queue::deQueue(int &item)
{
	if(isEmpty())
		return false;
	
	item=head->item;
	items--;
	Node *temp=head;
	head=head->next;
	delete temp;
	
	if(items==0)  //队内无元素
		tail=NULL;
	return true;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值