(通用队列的顺序实现)请用顺序存储实现通用队列的数据结构MyQueue。你所实现的队列应包括:出队、入队、访问队首、判断队列是否已满,判断队列是否为空等功能。利用你实现的MyQueue实现输入整数序列的顺序输出。
【输入】整数序列以-1结束,序列长度小于100
【输出】输入整数序列的顺序序列
例如:
【输入】3 9 8 2 5 -1
【输出】3 9 8 2 5
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
#define MaxSize 100 //队列的最大容量
typedef int DataType; //队列中元素类型
typedef struct Queue
{
DataType Queue[MaxSize];
int front; //队头指针
int rear; //队尾指针
}MyQueue;
void InitQueue(MyQueue *Q)//队列初始化,将队列初始化为空队列
{
Q->front = Q->rear = 0; //把对头和队尾指针同时置0
}
int IsEmpty(MyQueue *Q)//判断队列为空
{
if (Q->front == Q->rear)
{
return 1;
}
return 0;
}
int IsFull(MyQueue* Q)//判断队列是否为满
{
if (Q->rear == MaxSize)
{
return 1;
}
return 0;
}
int EnQueue(MyQueue *Q,DataType data) //入队,将元素data插入到队列SQ中
{
if (IsFull(Q))
{
printf("队列已满\n");
return 0;
}
Q->Queue[Q->rear] = data; //在队尾插入元素data
Q->rear = Q->rear + 1; //队尾指针后移一位
}
int DeQueue(MyQueue* Q,DataType* data)//出队,将队列中队头的元素data出队,出队后队头指针front后移一位
{
if (IsEmpty(Q))
{
printf("队列为空!\n");
return 0;
}
*data = Q->Queue[Q->front]; //出队元素值
Q->front = (Q->front)+1; //队尾指针后移一位
return 1;
}
int GetHead(MyQueue *Q,DataType *data)//获取队首元素
{
if (IsEmpty(Q))
{
printf("队列为空!\n");
}
return *data = Q->Queue[Q->front];
}
void ClearQueue(MyQueue* Q)//清空队列
{
Q->front = Q->rear = 0;
}
int main()
{
MyQueue *myqueue=malloc(sizeof(DataType)*MaxSize+sizeof(int)+sizeof(int));
/*不能直接写MyQueue *Q;
这样声明的话,编译器会分配一个空指针给Q.然后由于Q是空指针,所以对Q的一切访问都是非法的,所以即使是初始化操作都会出现段错误.
正确的声明方法应该是在声明的时候就使用malloc函数给Q分配相应的空间,然后才能继续进一步操作
*/
InitQueue(myqueue);
int i;
while(scanf("%d",&i)&&i!=-1)
EnQueue(myqueue,i);
while(!IsEmpty(myqueue)){
DeQueue(myqueue,&i);
printf("%d ",i);
}
}