/*
队头指针指向对头元素,队尾指针指向队尾元素的下一个位置。
初始状态(队空状态)Q.front==Q.rear==0
队满状态:Q.rear==MaxSize(可能是假满)
进队操作:队不满时,先送值到队尾元素,再将队尾指针加1
出队操作:队不空时,先取队头元素值,再将对头指针加1
*/
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
//顺序队列存储结构
typedef struct
{
int *base; //存放队列元素
int front, rear; //队头指针和队尾指针
}SqQueue;
//**********************初始化*************************
int InitQueue(SqQueue &Q)
{
Q.base=new int[MaxSize];
//if(!=Q.base) exit(OVERFLOW);
Q.front = 0;
Q.rear = 0;
return 1;
}
//********************求顺序表长度*********************
int QueueLength(SqQueue Q)
{
return (Q.rear - Q.front+MaxSize)%MaxSize;
}
//***********************入队操作********************
int EnQueue(SqQueue &Q, int e)
{
if ((Q.rear+1) % MaxSize==Q.front) //判断队列是否满
return 0;
Q.base[Q.rear] = e; //元素e赋值给队尾
Q.rear=(Q.rear+1)%MaxSize; //队尾指针后移
return 1;
}
//************************出队操作****************
int DeQueue(SqQueue &Q, int &e)
{
if (Q.rear == Q.front) //队空
return 0;
e = Q.base[Q.front]; //对头元素赋值给e
Q.front = (Q.front+1) % MaxSize; //对头指针后移
return 1;
}
int GetHead(SqQueue Q){
if(Q.front!=Q.rear)
return Q.base[Q.front];
}
//打印队列元素
void PrintSeqCirQueue(SqQueue &SCQ)
{
//assert(SCQ); //断言SCQ不为空
int i = SCQ.front;
if (SCQ.front < SCQ.rear)
{
for (; i < SCQ.rear; i++)
{
printf("%-3d", SCQ.base[i]);
}
}
else
{
for (i; i <SCQ.rear + MaxSize; i++)
{
printf("%-3d", SCQ.base[i]);
}
}
printf("\n");
}
int main()
{
int i, e, n; //e入队元素,n入队元素个数
SqQueue Q;
InitQueue(Q); //初始化
printf("初始化成功\n");
printf("请输入入队元素个数\n");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("请输入第%d个元素值", i + 1);
scanf("%d", &e);
if (EnQueue(Q, e))
printf("入队成功\n");
else printf("入队失败\n");
}
if (DeQueue(Q, e))
printf("\n元素%d出队\n", e);
else printf("出队失败\n");
printf("链表长度为%d\n", QueueLength(Q));
printf("队头元素为%d\n", GetHead(Q));
PrintSeqCirQueue(Q);
return 0;
}
2.3顺序队列的基本操作
最新推荐文章于 2024-11-06 11:05:01 发布