使用链表实现队列C++

要求

\quad 使用链表实现队列,需要能够实现插入、删除元素输出当前队列长度.

分析

  1. 使用链表作为实现队列的数据结构,按照先入先出的原则,插入元素在链表尾部插入,然后更新链表尾部指针,出队列时,在链表头部输出对应元素,然后更新头链表指针。为实现以上操作需要定义两个指针变量,ListNode* head指向链表头,ListNode* tail指向链表尾。
  2. 在出队列过程中,一边出队列,一边回收开辟的内存
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;
};

希望大家多提程序优化和编程规范的意见 !!!

你可能感兴趣的:(数据结构,队列,链表,指针,数据结构,c++)