队列

队列是一种限定存取位置的线性表。它只允许在表的一端插入,在另一端删除。

队列的核心思维是:入队的时候用队尾指针控制,出队的时候用队首指针控制。

编程总结:

1、在类中声明变量,在构造函数中初始化,是个很好的编程方法。

2、入队的时候用队尾指针控制,出队的时候用队首指针控制。

3、用到指针的时候,时时刻刻判断指针的值和指向。

队列的抽象数据类型表示代码为:

//队列结点
struct QueueNode
{
	int data;
	QueueNode *next;
};

//队列,先入先出的数据结构
class Queue{
public:
	//构造函数析构函数
	Queue()
	{
		//要善于利用构造函数初始化这个操作
		queuehead=NULL;
		queuerear=NULL;
	}
	~Queue(){}

	//入队,出队操作
	void EnQueue(int data);	//入队函数
	int	 DeQueue();			//出队函数

private:
	//核心思想:入队是用队尾指针控制的,出队是用队头指针控制的。
	QueueNode *queuehead,*queuerear;
};

入队函数的算法:

1、要声明一个队头指针和队尾指针,并在构造函数中初始化为空。最佳实践。
2、判断队头指针是否为空,如果为空,则说明是空队列,则将队头指针,队尾指针都指向新建的结点地址。
3、如果队头指针不为空,则不是空队列,则用队尾指针进行操作。
4、队尾指针的下一个地址指向新建的结点,进行赋值操作,然后队尾指针指向这个结点。

代码:

void Queue::EnQueue(int data)
{
	if(queuehead==NULL)
	{
		queuehead=queuerear=new QueueNode;
		if(queuehead==NULL)
			cout<<"队列结点分配失败"<<endl;
		queuehead->data=data;
		queuerear->data=data;	//分配这个值
	}
	else
	{
		queuerear->next=new QueueNode;
		if(queuerear->next==NULL)cout<<"内存分配错误"<<endl;
		queuerear->next->data=data;
		queuerear=queuerear->next;
		queuerear->next=NULL;	//将最后的这个元素赋值为0
	}
	
	
}

出队函数的算法:

1、如果队头指针不等于队尾指针,则将队头指针指向的值赋值给要返回
的值,然后将队头指针下移一个单位。
2、如果队头和队尾指针相等了,则说明队列为空了。
3、如果队头指针的下一个位置为空了,就说明队列遍历完了。

代码:

int Queue::DeQueue()
{
	int data;
	if(queuehead!=NULL)		//判断队头指针是否为空
	{
		QueueNode *p;
		data=queuehead->data;
		p=queuehead;
		queuehead=queuehead->next;
		delete p;	//释放这个指针
		return data;
	}
	else
	{
		cout<<"队列中已经没有元素了"<<endl;
		return 0;
	}


}

队列的操作比较简单,后续需要完成队列的变形及其在具体应用中算法。

1、循环队列。

2、优先级队列。

3、双端队列。

4、打印二项式的系数。

5、电路布线。

posted @ 2013-04-23 18:48  李VS超  阅读(334)  评论(0编辑  收藏  举报