数据结构之顺序队列的实现

顺序队列,即利用顺序表来是实现队列的基本操作。什么是队列?一堆人在排队的时候,肯定是队首的人先得到服务。而队尾的人则最后得到服务,同时要想进入队列只能从队尾进行进入,不能插队。所以在用顺序表来实现的时候,需要定义队列的头与队列的尾部,这样就能够更好的对尾部进行插入,头部进行取出。

实现

//seqqueue.h
#pragma once

#include <stdio.h>
#include <stddef.h>

#define SQUEUEMAX 1000

typedef char SeqQueueType;

typedef struct SeqQueue{
  SeqQueueType data[SQUEUEMAX];
  size_t head;
  size_t tail;
  size_t size;
}SeqQueue;

SeqQueue q;

void SeqQueueInit(SeqQueue* q);//初始化顺序式队列

void SeqQueuePush(SeqQueue* q, SeqQueueType value);//入顺序式队列

void SeqQueuePop(SeqQueue* q);//出顺序式队列

void DestroySeqQueue(SeqQueue* q);//销毁顺序式队列

int SeqQueueGetFront(SeqQueue* q, SeqQueueType* value);//获取队首

//seqqueue.c


#include "seqqueue.h"

#define HEAD printf("=================%s===============\n",__FUNCTION__)

void SeqQueueInit(SeqQueue* q)//初始化顺序式队列
{
  if(q == NULL)
  {
    return;
  }

  q->head = 0;
  q->tail = 0;
  q->size = 0;

  return;
}

void DestroySeqQueue(SeqQueue* q)//销毁顺序式队列
{
  if(q == NULL)
  {
    return;
  }

  q->head = 0;
  q->tail = 0;
  q->size = 0;

  return;
}

void SeqQueuePush(SeqQueue* q, SeqQueueType value)//入顺序式队列
{
  if(q == NULL)
  {
    return;
  }
  if(q->size >= SQUEUEMAX)
  {
    return;
  }

  if(q->size == 0)
  {
    q->data[q->head] = value;
    ++q->tail;
    ++q->size;
  }
  else
  {
    q->data[q->tail++] = value;
    ++q->size;
  }

  if(q->tail >= SQUEUEMAX)
  {
    q->tail = 0;
  }

  return;
}

void SeqQueuePop(SeqQueue* q)//出顺序式队列
{
  if(q == NULL)
  {
    return;
  }
  if(q->size == 0)
  {
    return;
  }

  ++q->head;
  if(q->head >= SQUEUEMAX)
  {
    q->head = 0;
  }
  --q->size;

  return;
}

int SeqQueueGetFront(SeqQueue* q, SeqQueueType* value)//获取队首
{
  if(q == NULL || value == NULL)
  {
    return -1;
  }

  *value = q->data[q->head];
  return 1;
}
//测试代码如下

void SeqQueuePrint(SeqQueue* q)
{
  if(q == NULL)
  {
    return;
  }
  if(q->size == 0)
  {
    return;
  }

  size_t i = q->head;
  for(; i != q->tail; ++i)
  {
    if(i >= SQUEUEMAX)
    {
      i = 0;
    }
    printf("%c ",q->data[i]);
  }
  printf("\n");
}

void TestPush()
{
  HEAD;
  SeqQueue q;
  SeqQueueInit(&q);
  SeqQueuePush(&q,'a');
  SeqQueuePush(&q,'b');
  SeqQueuePush(&q,'c');
  SeqQueuePush(&q,'d');
  SeqQueuePrint(&q);
}

void TestPop()
{
  HEAD;
  SeqQueue q;
  SeqQueueInit(&q);
  SeqQueuePush(&q,'a');
  SeqQueuePush(&q,'b');
  SeqQueuePush(&q,'c');
  SeqQueuePush(&q,'d');
  SeqQueuePrint(&q);

  SeqQueuePop(&q);
  SeqQueuePrint(&q);
  SeqQueuePop(&q);
  SeqQueuePrint(&q);
  SeqQueuePop(&q);
  SeqQueuePrint(&q);
  SeqQueuePop(&q);
  SeqQueuePrint(&q);
}

void TestGetFront()
{
  HEAD;
  SeqQueue q;
  SeqQueueInit(&q);
  SeqQueuePush(&q,'a');
  SeqQueuePush(&q,'b');
  SeqQueuePush(&q,'c');
  SeqQueuePush(&q,'d');
  SeqQueuePrint(&q);

  SeqQueueType value;
  int ret = SeqQueueGetFront(&q,&value);
  printf("expected ret 1, actual %d\n",ret);
  printf("%c \n",value);
}

int main()
{
  TestPush();
  TestPop();
  TestGetFront();

  printf("\n");
  printf("\n");
  printf("\n");
  printf("\n");
  printf("\n");
  return 0;
}

欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值