#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAXQSIZE 5 //最大队列长度
typedef struct SqQueue
{
int * base;
int front; //队头指针 若队列不空 指向队列头元素
int rear; //尾指针 若队列不空 指向队列尾元素的下一个位置
}SqQueue;
bool InitQueue(SqQueue *q); //队列的初始化
void QueueEmpty(SqQueue q); // 判断队列是否为空
int QueueLength(SqQueue q); //求队列的长度
bool EnQueue(SqQueue *q,int e); //入队
bool QueueTraverse(SqQueue *q); //输出队列元素 址传递
//bool QueueTraverse(SqQueue q); //输出队列元素 值传递 两种输出方式均可
bool DeQueue(SqQueue *q,int *e); //删除队头元素 用e返回
bool GetHead(SqQueue q,int *e); //返回队头元素
bool ClearQueue(SqQueue *q); //清空队列
bool DestoryQueue(SqQueue *q); //销毁队列
int main() //主函数
{
int i, n;
int d;
SqQueue q;
InitQueue(&q);
QueueEmpty(q);
printf("队列的长度:%d\n",QueueLength(q));
printf("请输入队列元素个数:");
scanf("%d",&n);
for(i = 0; i < n; i++)
{
scanf("%d",&d);
EnQueue(&q,d);
}
printf("队列的长度:%d\n",QueueLength(q));
QueueEmpty(q);
printf("现在队列中的元素:\n");
QueueTraverse(&q);
//QueueTraverse(q);
DeQueue(&q,&d);
printf("删除的队头元素为 %d\n",d);
printf("队列中的元素:\n");
QueueTraverse(&q);
if( GetHead(q,&d) )
printf("队头元素为:%d\n",d);
else
printf("队头元素为空\n");
ClearQueue(&q);
QueueEmpty(q);
if( GetHead(q,&d) )
printf("队头元素为:%d\n",d);
else
printf("无队头元素\n");
DestoryQueue(&q);
return 0;
}
bool InitQueue(SqQueue *q) //队列的初始化
{
q->base = (int *)malloc(MAXQSIZE*sizeof(int));
if(q->base == NULL)
{
printf("内存分配失败 程序终止");
exit(-1);
}
q->front = q->rear = 0;
return true;
}
void QueueEmpty(SqQueue q) // 判断队列是否为空
{
if(q.front == q.rear) //队列空
printf("队列为空\n");
else
printf("队列不为空\n");
}
int QueueLength(SqQueue q) //求队列的长度
{
return (q.rear - q.front);
}
bool EnQueue(SqQueue *q,int e) //入队
{
if(q->rear >= MAXQSIZE) //队列满 增加一个存储单元
{
q->base = (int *)realloc(q->base,(q->rear+1)*sizeof(int));
if(q->base == NULL)
{
printf("内存分配失败 程序终止\n");
exit(-1);
}
}
*(q->base + q->rear) = e;
q->rear++;
return true;
}
bool QueueTraverse(SqQueue *q) //输出队列元素
{
int i;
i = q->front;
while(i != q->rear)
{
printf("%d ",q->base[i]);
i++;
}
printf("\n");
return true;
}
/*
bool QueueTraverse(SqQueue q)
{
int i;
i = q.front;
while(i != q.rear)
{
printf("%d ",q.base[i]);
i++;
}
printf("\n");
return true;
}
*/
bool DeQueue(SqQueue *q,int *e) //删除队头元素 用e返回
{
if(q->front == q->rear) //队列为空
return false;
*e = q->base[q->front];
q->front = q->front + 1;
return true;
}
bool GetHead(SqQueue q,int *e) //返回队头元素
{
if(q.rear == q.front)
{
return false;
}
*e = q.base[q.front];
return true;
}
bool ClearQueue(SqQueue *q) //清空队列
{
q->front = q->rear = 0;
return true;
}
bool DestoryQueue(SqQueue *q) //销毁队列
{
if(q->base)
free(q->base);
q->base = NULL;
q->front = q->rear = 0;
return true;
}
顺序队列(非循环)
最新推荐文章于 2022-01-04 23:32:39 发布