基于尾循环链表的链队列
题目
以不带头结点的循环链表表示队列,并且队列只设一个队尾指针,不设头指针,实现入队和出队操作并验证操作(队列);
设计
底层为带有尾指针的单循环链表,在我的程序中,头结点不带元素,它的存在仅是为了便利循环条件的设置。
尾巴(尾结点):rear
头结点:rear->next
首元结点:rear->next->next
早上起晚了,仅实现了基础操作。
Queue.h
/*
*YiXing Liu
*Link Queue By CircleLinkList
*/
#include<iostream>
using namespace std;
//是否可以指定size变量用于检测是否为空
struct Node
{
int data;
Node* next; //后继
};
//基于尾循环链表的链队列
class Queue
{
private:
Node* rear; //队尾指针
public:
Queue(/* args */);
~Queue();
void EnQueue(int x); //入队
int DeQueue(); //出队
int GetHead(); //取队头元素 但并不删除
void printQueue(); //遍历输出队列元素
};
Queue.cpp
#include"Queue.h"
//循环结构 那么队头如何表示 表示为rear->next
Queue::Queue()
{
this->rear=new Node;
rear->next=rear; //空队列的条件
}
Queue::~Queue()
{
//借助size进行析构
}
void Queue::EnQueue(int x)
{
//入队
Node* head=rear->next; //队头
cout<<"入队前"<<endl;
cout<<"rear:"<<this->rear<<endl;
//初始化新结点newNode
Node* newNode=new Node; //newNode插到队尾
newNode->data=x;
cout<<"新结点"<<newNode<<endl;
rear->next=newNode; //旧队尾的后继为新结点
newNode->next=head; //rear->next相当于队头 循环接链
this->rear=newNode; //更新队尾
cout<<"入队后"<<endl;
cout<<"rear:"<<this->rear<<endl;
cout<<"rear->next:"<<rear->next<<endl;
cout<<endl;
}
int Queue::DeQueue()
{
//出队 抛出首元结点即可 并进行链接
Node* head=rear->next;
Node* first=head->next;
int val=first->data;
head->next=first->next;
delete first;
return val;
}
int Queue::GetHead()
{
// if(this->rear->next=rear)
// {
// return -9;
// }
Node* head=rear->next;
Node* first=head->next;
return first->data;
}
void Queue::printQueue()
{
//遍历输出队列元素
Node* head=rear->next; //头结点
Node* first=head->next;
Node* workNode=head;
while(workNode!=rear)
{
workNode=workNode->next;
cout<<workNode->data<<" ";
}
cout<<endl;
}
main.cpp
#include "Queue.h"
int main()
{
cout << "题目一" << endl;
Queue q1;
q1.EnQueue(1);
q1.EnQueue(2);
q1.EnQueue(3);
q1.printQueue();
cout << "取头:" << q1.GetHead() << endl;
cout << "出队:" << q1.DeQueue() << endl;
q1.printQueue();
cout << "取头:" << q1.GetHead() << endl;
cout << "出队:" << q1.DeQueue() << endl;
q1.printQueue();
cout << "取头:" << q1.GetHead() << endl;
cout << "出队: " << q1.DeQueue() << endl;
//cout << "取头:" << q1.GetHead() << endl;
system("pause");
return 0;
}
运行
思考
我们是不是可以添加一个size变量进行控制
基于size去实现一些操作,比如析构和判空
数据结构思考时一定要将结构可视化!