队列

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

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

编程总结:

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、电路布线。

你可能感兴趣的:(队列)