队列:
限定所有的插入操作在表的一端进行,而 删除操作在表的另一端进行的线性表。
允许进行插入操作的一端称为队尾 (rear),
允许进行删除操作的一端称为队头(front)
1.队列类型的定义
#define MAX 50
typedef struct
{
ElemType data[MAX];
int front,rear;//front为队首指针 rear为队尾指针
}SqQueue;
typedef int ElemType;
typedef SqQueue CSqQueue;
2.初始化运算
/*初始化运算得到一个空队列*/
int InitQueue(CSqQueue *Q)
{
(*Q).front=0;
(*Q).rear=0;
return 0;
}
3.判空运算的实现
/*判断运算,队列Q为空返回1,否则返回0*/
int QueueEmpty(CSqQueue Q)
{
if(Q.front==Q.rear)
return 1;
return 0;
}
4.判满运算的实现
int QueueFull(CSqQueue Q)
{
if((Q.rear+1)%MAX==q.front)
return 1;
return 0;
}
5.创建运算的实现
/*创建一个队列,创建成功返回1,创建失败返回0*/
int CreatQueue(CSqQueue *Q)
{
int i,n;
ElemType temp_e;
printf("Please input the length of the queue which you want to creat:\n");
scanf("%d",&n);
if(n>MAX)
return -1;
for(i=1;i<=n,i++){
printf("Please input NO.%d enter element:\n",i);
scanf("%d",&temp_e);
EnQueue(Q,temp_e);
}
return 0;
}
6.求长度运算的实现
/*返回队列长度*/
int QueueLength(CSqQueue Q)
{
return (Q.rear-Q.front+MAX)%MAX;
}
7.访问队首运算的实现
/*返回队首元素的值*/
int GetHead(CSQqueue Q,ElemType *e)
{
if(QueueEmpty(Q))
{
return-1;
}
*e=Q.data[Q.front];
return 0;
}
8.入队的实现
/*队尾插入新元素*/
int EnQueue(CSqQueue *Q,ElemType *e)
{
if(QueueEmpty(*Q))
{
return-1;
}
(*Q).data[(*Q).rear]=e;
(*Q).rear=((*Q).rear+1)%MAX;
return 0;
}
9.出队的实现
/*删除队首,并用变量e返回被删除元素*/
int DeQueue(CSqQueue *Q,ElemType *e)
{
if(QueueEmpty(*Q))
{
return-1;
}
e=(*Q).data[(*Q).front)];
(*Q).front=((*Q).front+1)%MAX;
return 0;
}
10.打印运算的实现
/*输出队列Q*/
void ShowQueue(CSqQueue Q)
{
ElemType temp_e;
while (!=QueueEmpty(Q))
{
DeQueue(&Q,&temp_e);
printf("%d",temp_e)
}
printf("\n");
}