队列实现 队列的链式结构实现

队列的实现, 用单链表实现队列的结构

1>初始化创建队列

2>释放队列

3>清空队列

4>计算队列长度

5>判断队列是否为空

6>打印队列元素

7>入队操作 队尾插入

8>出队操作 队首删除


#include <iostream>

typedef int DataType;
struct QNode
{
  DataType data;
  QNode*    next;
};

struct LQueue
{
  QNode* front;
  QNode* real;
};

enum Status{OK, ERROR, MEMFAILED};

// 初始化建立队列
int InitQueue(LQueue& que)
{
  que.front = (QNode*) malloc(sizeof(QNode));
  if (NULL == que.front)
  {
    return MEMFAILED;
  }

  que.real = que.front;
  que.front->next = NULL;
  
  return OK;
}

// 释放销毁队列
void DestoryQuque(LQueue& que)
{
  while(que.front)
  {
    que.real = que.front->next;
    free(que.front);
    que.front = que.real;
  }

  std::cout << "Destory queue succeed ~" << std::endl;
}

// 清空队列
void ClearQueue(LQueue& que)
{
  QNode* ptr = que.front->next;
  while(NULL != ptr)
  {
    que.real = ptr->next;
    free(ptr);
    ptr = que.real;
  }
  que.real = que.front;

  std::cout << "Clear queue succeed ~" << std::endl;
}

// 计算队列长度
int LengthQueue(LQueue& que)
{

  int len = 0;
  QNode* ptr = que.front;
  while(ptr != que.real)
  {
    ++len;
    ptr = ptr->next;
  }

  return len;
}

// 判断队列是否为空
int EmptyQueue(LQueue& que)
{
  if (que.front == que.real)
    return 1;
  return 0;
}

// 打印队列现有元素
void PrintQueue(LQueue& que)
{
  QNode* ptr = que.front->next;
  std::cout << "Queue elems [";
  while(ptr)
  {
    std::cout << " " << ptr->data;
    ptr = ptr->next;
  }
  std::cout << " ]" << std::endl;
}

// 入队 队尾进去
int PushQueue(LQueue& que, DataType val)
{
  QNode* node = (QNode*) malloc(sizeof(QNode));
  if (NULL == node)
  {
    return MEMFAILED;
  }

  node->data = val;
  node->next = NULL;
  que.real->next = node;
  que.real = node;

  return OK;
}

// 出队 对首元素
 int PopQueue(LQueue& que, DataType& val)
{
  if (que.front == que.real)
    return ERROR;

  QNode* ptr = que.front->next;
  val = ptr->data;
  que.front->next = ptr->next;

  if (ptr == que.real)       // 需要判断是不是最后一个元素 
    que.real = que.front;

  free(ptr);

  return OK;
}


int main()
{

  LQueue que;
  InitQueue(que);
  PrintQueue(que);
  std::cout << "current queue empty-val :" << EmptyQueue(que) << std::endl;
  std::cout << "current queue length :" << LengthQueue(que) << std::endl;

  for (int i = 1; i <= 10; i++)
  {
    PushQueue(que, i);
    PrintQueue(que);
    std::cout << "current queue empty-val :" << EmptyQueue(que) << std::endl;
    std::cout << "current queue length :" << LengthQueue(que) << std::endl;
  }

  std::cout << "pop " << std::endl;
  DataType val;
  for (int i = 1; i <= 15; i++)
  {

    if (ERROR == PopQueue(que, val))
    {
      std::cout << "Pop error ~~" << std::endl;
      break;
    }
    PrintQueue(que);
    std::cout << "current pop val :" << val << std::endl;
    std::cout << "current queue length :" << LengthQueue(que) << std::endl;
  }

  ClearQueue(que);
  PrintQueue(que);
  std::cout << "current queue length :" << LengthQueue(que) << std::endl;

  DestoryQuque(que);
  return 0;

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值