数据结构-顺序表实现队列的基本操作

队列的定义

队列是另一种限定的数据结构,它只允许在表的一端插入,另一端删除。所以队列具有先进先出的特性。这与我们生活中的排队是一个道理。
在队列中允许删除的一端叫做队头,允许插入的一端叫做队尾。

队列分类

  • 顺序队列(容易引起假溢出情况:顺序队列因多次入队,出队后出现的尚有存储空间,但不能在进行如队列的操作)
  • 优先级队列
  • 循环队列

本文用顺序表实现队列的基本操作

  • 初始化
    操作前提:未被初始化的队列
    操作结果:将队列初始化成一个空队列

  • 入队列
    操作前提:队列已存在
    操作结果:在队列结尾插入新元素

  • 出队列
    操作结果:队列已存在,并且不为空
    操作结果:将队头元素出队

  • 取队首元素:
    操作前提:队列已存在,并且不为空
    操作结果:取队头元素,并用value带回他的值,成功返回1,失败返回0

  • 销毁队列
    -操作前提:队列已存在
    -操作结果:队列设置成空队列

这里写图片描述

#include <stdlib.h>
#include "sequeue.h"
//初始化队列
void SequeueInit(Sequeue* sequeue)  
{
    if(sequeue==NULL)
    {
          printf("非法输入\n");
          return ;
    }
    sequeue->size=0;
    sequeue->capicity=1024; //设置容量
    sequeue->data=(SequeueType*)malloc(sequeue->capicity*sizeof(Sequeue));  //申请空间
}
//扩容
void  SequeueResize(Sequeue* sequeue)
{

    if(sequeue==NULL)
    {
          printf(  "  非法输入\n");
          return ;
    }
    SequeueType* new=NULL;
    //如果size>capicity,则扩容
    if(sequeue->size>=sequeue->capicity)
    {
          //扩大capicity
          sequeue->capicity=sequeue->capicity*2+1;
          //申请内存
          new=(SequeueType *)malloc(sequeue->capicity*sizeof( Sequeue));
    }
     size_t i=0;
     //搬移数据
    for(  ;i<sequeue->size;i++)
     {
         new[i]=sequeue->data[i];
     }
    //释放原来的指针
    free(sequeue->data);

    sequeue->data=new;





}

这里写图片描述


//入队列
void SequeuePush(Sequeue* sequeue,SequeueType value)
{

    if(sequeue==NULL)
    {
          printf(  "  非法输入\n");
          return ;
    }
    if(sequeue->size>=sequeue->capicity)
    {
          SequeueResize(sequeue);

    }
    //尾插
    sequeue->data[sequeue->size++]=value;
}
//打印队列
void SequeuePrint(Sequeue* sequeue,const char *s)
{
    if(sequeue==NULL)
    {
          printf(  "  非法输入\n");
          return ;
    }
    printf("%s\n",s);
    size_t i=0;
    for(  ;i<sequeue->size;i++)
    {
          printf("%c    ",sequeue->data[i]);  
    }
    printf("\n");
}

这里写图片描述


//出队列
void SequeuePop(Sequeue* sequeue)
{

    if(sequeue==NULL)
    {
          printf(  "  非法输入\n");
          return ;
    }
    if(  sequeue->size==0)
    {
          printf("空队列\n");
          return ;
    }
    size_t i=0;
    for(;i<sequeue->size;i++)
    {
          //搬移数据
          sequeue->data[i]=sequeue->data[i+1];
    }
    --sequeue->size;
}

这里写图片描述


//取队列顶元素
int SequeueTop(Sequeue* sequeue,SequeueType* value) 
{
      //取值失败返回0,成功返回1
    if(sequeue==NULL||value==NULL)
    {
          printf(  "  非法输入\n");
          return 0;
    }
    if(  sequeue->size==0)
    {
          printf("空队列\n");
          return 0;
    }
    *value=sequeue->data[0];
    return 1;

}

这里写图片描述


//销毁队列
void SequeueDestory(Sequeue* sequeue)
{
      if(sequeue==NULL)
      {
            printf("非法操作\n");
            return;
      }
      sequeue->size=0;
      sequeue->capicity=0;
      free(sequeue->data);

}

这里写图片描述


////////////////////////////////////////////////
//以下为测试代码
///////////////////////////////////////////////

#include <stdio.h>
#define TESTLINE printf("\n====================%s=================\n",__FUNCTION__)
//测试初始化
void TestInit(  )
{
    TESTLINE;
    Sequeue sequeue;
    SequeueInit(&sequeue);
    SequeuePrint(&sequeue,"初始化队列\n");


}
//测试压队列
void TestPush(  )
{

    TESTLINE;
    Sequeue sequeue;
    SequeueInit(&sequeue);
    SequeuePush(&sequeue,'a');
    SequeuePush(&sequeue,'b');
    SequeuePush(&sequeue,'c');
    SequeuePush(&sequeue,'d');
    SequeuePrint(&sequeue,"入队列四个元素\n");
    SequeuePush(&sequeue,'x');
    SequeuePush(&sequeue,'y');
    printf("\n");
    printf("继续入队列,期望是:a b   c   d   x   y\n");
    printf("\n");
    SequeuePrint(&sequeue,"继续入队列结果\n");




}
//测试出队列
void TestPop(  )
{

    TESTLINE;
    Sequeue sequeue;
    SequeueInit(&sequeue);
    SequeuePush(&sequeue,'a');
    SequeuePush(&sequeue,'b');
    SequeuePush(&sequeue,'c');
    SequeuePush(&sequeue,'d');
    SequeuePrint(&sequeue,"原始队列\n");
    SequeuePop(&sequeue);
    SequeuePop(&sequeue);
    printf("\n");
    printf("期望出队列后是:c   d\n");
    printf("\n");
    SequeuePrint(&sequeue,"出队列两个元素结果\n");
    SequeuePop(&sequeue);
    SequeuePop(&sequeue);
    printf("期望继续出队列是:\n");
    printf("\n");

    SequeuePrint(&sequeue,"再出队列两个元素结果\n");
}
//测试取队列顶元素
void TestTop(  )
{

    TESTLINE;
    Sequeue sequeue;
    SequeueInit(&sequeue);
    SequeuePush(&sequeue,'a');
    SequeuePush(&sequeue,'b');
    SequeuePush(&sequeue,'c');
    SequeuePush(&sequeue,'d');
    SequeueType value;
    int ret=SequeueTop(&sequeue,&value);
    printf("expect ret=1,actuall ret=%d\n",ret);
    printf("\n");
    printf("expect value:a,actuall value:%c\n",value);
}
//测试销毁队列
void TestDestory()
{

    TESTLINE;
    Sequeue sequeue;

    SequeueInit(&sequeue);
    SequeuePush(&sequeue,'a');
    SequeuePush(&sequeue,'b');
    SequeuePush(&sequeue,'c');
    SequeuePush(&sequeue,'d');
    SequeueDestory(&sequeue);
    printf("expect size is 0,actual size is:%d\n",sequeue.size);

}
int main()
{
    TestInit(  );
    TestPush(  );
    TestPop(  );
    TestTop(  );
    TestDestory(  );
    printf("\n");
    printf("\n");
    printf("\n");
    return;
}

错误:
sequeue.c:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘{’ token

原因:忘记在头文件函数声明语句结尾加上分号

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值