栈与队列(2)

栈 入栈顺序1 出栈顺序N

队列 入队列顺序1 出队列顺序1

队列的作用是用来保持公平性

出队操作,一定会影响头指针,如果出队之后,队列为空,会影响尾指针。

Queue.h

typedef int QDataType;
typedef struct QueueNode
{
  struct QueueNode* next;
  QDataType val;
}QNode;
typedef struct Queue
{
  QNode* phead;
  QNode* ptail;
  int size;
}Queue;
//队尾插入
void  QueuePush(QNode* pq,int x,QDataType x);
void  QueuePop(QNode* pq,int x);
/*void  QueuePush(QNode** pphead,QNode** pptail,int x,QDataType x);
void  QueuePop(QNode** pphead,QNode** pptail,int x);
 只要我们定义了Queue这样一个结构体,我们就不用再传入二级指针*/

Queue.c

#include"Queue.h"
void QueueInit(Queue* pq)
{
  assert(pq);
  pq->phead=NULL;
  pq->ptail=NULL;
  pq->size=0;
}
//队尾插入
void QueuePush(Queue* pq,QDataType x)
{
  QNode* newnode=(QNode*)malloc(sizeof(QNode));
  if(newnode==NULL)
  {
     perror("malloc fail");
     return;
   }
  newnode->next=NULL;
  newnode->val=x;
  if(pq->ptail==NULL)
  {
    pq->phead=pq->ptail=newnode;
  }
  else
  {
    pq->ptail->next=newnode;
    pq->ptail=newnode;
   }
  pq->size++;
}
}
void QueuePop(Queue* pq)
{
   assert(pq);
   assert(pq->size);
   if(pq->phead->next==NULL)
   {
      free(pq->phead);
      pq->phead=pq->ptail=NULL;
   }
   else
   {
   QNode* next=phead->next;
   free(pq->phead);
   pq->phead=next;
   /*if(pq->phead==NULL)
   {
     pq->ptail==NULL;
   }*/
   pq->size--;
   }
} 
QDataType QueueFront(Queue* pq)
{
   assert(pq);
   assert(pq->phead);
   return pq->phead->val;
}
QDataType QueueBack(Queue* pq)
{
   assert(pq);
   assert(pq->ptail);
   return pq->ptail->val;
}
int QueueSize(Queue* pq)
{
  assert(pq);
  return pq->size;
}
bool QueueEmpty(Queue* pq)
{
  assert(pq);
  return pq->size==0;
}
void QueueDestory(Queue* pq)
{
  assert(pq);
  QNode*cur=pq->phead;
  while(cur)
  {
    //保存下一个节点
    QNode*next=cur->next;
    free(cur);
    cur=next;
  }
  pq->phead=pq->ptail=NULL;
  pq->size=0;
}

622. 设计循环队列 - 力扣(LeetCode)

空间大小是固定的

head==tail是空还是满呢 方法一:额外多开一个空间

方法二:增加一个size

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值