要求
\quad使用链表实现队列,需要能够实现插入、删除元素,输出当前队列长度.
分析
- 使用链表作为实现队列的数据结构,按照先入先出的原则,插入元素在链表尾部插入,然后更新链表尾部指针,出队列时,在链表头部输出对应元素,然后更新头链表指针。为实现以上操作需要定义两个指针变量,ListNode* head指向链表头,ListNode* tail指向链表尾。
- 在出队列过程中,一边出队列,一边回收开辟的内存。
ListNode 数据结构
class ListNode
{
public: // 链表
ListNode(int data_)
{
this->data = data_;
this->next = NULL;
}
ListNode* next;
int data;
};
QueueList 数据结构 用于实现队列
class QueueList
{
public:
int Qsize()
{
return this->RealSize; // 返回当前的队列长度
};
void push(int data) // 入队列函数
{
...
};
int pop() // 出队列函数
{
...
};
ListNode* head = NULL; // 链表头指针
ListNode* tail = NULL; // 链表尾指针
int RealSize = 0; // 链表当前长度
};
void push(int data) 插入函数
void push(int data)
{
ListNode* temp = new ListNode(data); // 新建链表节点
if (this->head == NULL) // 链表头指针为NULL时
{ // 头指针和尾指针都赋值为temp
this->head = temp;
this->tail = temp;
}
else
this->tail->next = temp; // 在链表尾部添加元素
this->tail = temp; // 更新链表指针
++this->RealSize; // 当前队列自增
};
int pop() 删除函数
int pop()
{
int AnsPop = -1; // 出队列元素
if (this->head != NULL) // 当头指针不为NULL,删除该节点
{
AnsPop = this->head->data; // 记录返回元素
ListNode* ListNodeSave = this->head->next; // 保存头节点后的节点
delete this->head; // 释放出队列元素对应的节点
this->head = ListNodeSave; // 更新头节点
std::cout << "Queue delete element " << AnsPop << std::endl;
--this->RealSize; // 队列长度自减
}
else // 头节点为空时,返回不能删除
{
std::cout << "Queue empty, cant pop" << std::endl;
}
return AnsPop; // 返回该元素
};
QueueListFun() 测试函数
void QueueListFun()
{
QueueList Queue;
int ElementArray[] = { 1,2,3,4,5,6,7,8 };
for (int i = 0; i < 8; ++i)
{
Queue.push(ElementArray[i]);
std::cout << "Queue push elemnet " << ElementArray[i] << std::endl;
ListNode *ListNodeTemp = Queue.head;
while (ListNodeTemp != NULL)
{
std::cout << ListNodeTemp->data << " ";
ListNodeTemp = ListNodeTemp->next;
}
std::cout << std::endl;
}
std::cout << "***********" << std::endl;
for (int i = 0; i < 8; ++i)
{
Queue.pop();
ListNode* ListNodeTemp = Queue.head;
while (ListNodeTemp != NULL)
{
std::cout << ListNodeTemp->data << " ";
ListNodeTemp = ListNodeTemp->next;
}
std::cout << std::endl;
}
std::cout << "***********" << std::endl;
for (int i = 0; i < 8; ++i)
{
Queue.push(ElementArray[i]);
std::cout << "Queue push elemnet " << ElementArray[i] << std::endl;
ListNode* ListNodeTemp = Queue.head;
while (ListNodeTemp != NULL)
{
std::cout << ListNodeTemp->data << " ";
ListNodeTemp = ListNodeTemp->next;
}
std::cout << std::endl;
}
std::cout << "***********" << std::endl;
for (int i = 0; i < 4; ++i)
{
Queue.pop();
ListNode* ListNodeTemp = Queue.head;
while (ListNodeTemp != NULL)
{
std::cout << ListNodeTemp->data << " ";
ListNodeTemp = ListNodeTemp->next;
}
std::cout << std::endl;
}
std::cout << "***********" << std::endl;
for (int i = 0; i < 4; ++i)
{
Queue.push(ElementArray[i]);
std::cout << "Queue push elemnet " << ElementArray[i] << std::endl;
ListNode* ListNodeTemp = Queue.head;
while (ListNodeTemp != NULL)
{
std::cout << ListNodeTemp->data << " ";
ListNodeTemp = ListNodeTemp->next;
}
std::cout << std::endl;
}
std::cout << "***********" << std::endl;
for (int i = 0; i < 9; ++i)
{
Queue.pop();
ListNode* ListNodeTemp = Queue.head;
while (ListNodeTemp != NULL)
{
std::cout << ListNodeTemp->data << " ";
ListNodeTemp = ListNodeTemp->next;
}
std::cout << std::endl;
}
std::cout << "***********" << std::endl;
};
希望大家多提程序优化和编程规范的意见 !!!