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