一、基本思路
1.与顺序栈的操作几乎一样,区别是在删除元素时,删除的是第一个结点;
2.顺序栈的空间是由base指针申请的,利用top指针进行插入、删除操作,并不影响base,因此最后释放时,能全部释放;
3.但顺序队列不同,若建立front和rear_next(最后一个元素的下一个位置),若由front申请内存,在删除操作时会更改front的
指向,最后释放时会造成内存泄漏;
4.因此建立额外专门产生内存的指针,这样修改front和rear_next都不会影响到最后内存的释放;
二、代码如下
/*
项目名称:顺序队列的建立与基本操作
编译环境:VC++ 2008
作者相关:。。。
最后修改:2019.6.23
学习目标:初始化、销毁、清空、判空、求长、返回队头元素、插入元素、删除元素、输出队列中元素
注意事项:1.测试所有功能是否正常
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define QUEUE_INIT_SIZE 100
#define QUEUEINCREMENT 10
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef bool Status;
typedef struct{
ElemType *front;//头指针
ElemType *rear_next;//rear指向最后一个元素的下一个位置
ElemType *room;//用于产生动态内存
int queuesize;//队列容量
}SqQueue;
Status InitQueue(SqQueue *s);
Status DestroyQueue(SqQueue *s);
Status ClearQueue(SqQueue *s);
Status QueueEmpty(SqQueue s);
int QueueLength(SqQueue s);
Status GetHead(SqQueue s,ElemType *e);
Status EnQueue(SqQueue *s,ElemType e);
Status DeQueue(SqQueue *s,ElemType *e);
Status QueueTraverse(SqQueue s);
void visit(ElemType c);
int main()
{
SqQueue s;
ElemType e;
InitQueue(&s);
if(QueueEmpty(s))
printf("队列为空!\n\n");
else
printf("队列非空!\n\n");
int k = QueueLength(s);
printf("队列的长度为:%d \n\n",k);
for(int i=1;i<10;i++)
EnQueue(&s,i);
QueueTraverse(s);
GetHead(s,&e);
printf("队首元素为:%d \n\n",e);
DeQueue(&s,&e);
printf("删除的元素为:%d \n\n",e);
ClearQueue(&s);
DestroyQueue(&s);
return 0;
}
Status InitQueue(SqQueue *s)
{
s->room = (ElemType *)malloc(QUEUE_INIT_SIZE*sizeof(ElemType));
if(!s->room)
return ERROR;
s->rear_next = s->front = s->room;
s->queuesize = QUEUE_INIT_SIZE;
return OK;
}
Status DestroyQueue(SqQueue *s)
{
free(s->room);
return OK;
}
Status ClearQueue(SqQueue *s)
{
s->rear_next = s->front = s->room;
return OK;
}
Status QueueEmpty(SqQueue s)
{
if(s.rear_next==s.front)
return true;
else
return false;
}
int QueueLength(SqQueue s)
{
return s.rear_next-s.front;
}
Status GetHead(SqQueue s,ElemType *e)
{
if(!QueueEmpty(s))
*e = *s.front;
return OK;
}
Status EnQueue(SqQueue *s,ElemType e)//操作与栈相同
{
if(s->queuesize<=QueueLength(*s))
{
s->room = (ElemType *)realloc(s->room,
(s->queuesize+QUEUEINCREMENT)*sizeof(ElemType));
if(!s->room)
return ERROR;
s->front = s->room;
s->rear_next=s->room+s->queuesize;
s->queuesize+=QUEUEINCREMENT;
}
*s->rear_next++=e;
return OK;
}
Status DeQueue(SqQueue *s,ElemType *e)
{
if(QueueEmpty(*s))
return ERROR;
else
*e = *s->front++;
return OK;
}
Status QueueTraverse(SqQueue s)
{
printf("队列内容: ");
while(s.front != s.rear_next)
{
visit(*s.front);
++s.front;
}
printf("\n\n");
return OK;
}
void visit(ElemType c)
{
printf("%d ",c);
}