队列的定义
队列是另一种限定的数据结构,它只允许在表的一端插入,另一端删除。所以队列具有先进先出的特性。这与我们生活中的排队是一个道理。
在队列中允许删除的一端叫做队头,允许插入的一端叫做队尾。
队列分类
- 顺序队列(容易引起假溢出情况:顺序队列因多次入队,出队后出现的尚有存储空间,但不能在进行如队列的操作)
- 优先级队列
- 循环队列
本文用顺序表实现队列的基本操作
初始化
操作前提:未被初始化的队列
操作结果:将队列初始化成一个空队列入队列
操作前提:队列已存在
操作结果:在队列结尾插入新元素出队列
操作结果:队列已存在,并且不为空
操作结果:将队头元素出队取队首元素:
操作前提:队列已存在,并且不为空
操作结果:取队头元素,并用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
原因:忘记在头文件函数声明语句结尾加上分号