队列
队列是一种限定存取位置的线性表。它只允许在表的一端插入,在另一端删除。
队列的核心思维是:入队的时候用队尾指针控制,出队的时候用队首指针控制。
编程总结:
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、电路布线。

浙公网安备 33010602011771号