模仿C++标准库的成员函数写的队列操作,是循环队列,减少一个存储代码来判断满栈,具体思路见代码。
完整代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
typedef int datatype;
/**记录 满队列 状态 的方法是少用一个单位
*队列为:队首front指向第一个元素,队尾rear指向最后一个元素的下一个位置
*/
typedef struct q_node *ptrNode;
typedef struct q_node
{
int data[MAXSIZE];
int rear,front_;//rear 末尾
}queue_node;
typedef ptrNode queue_;
queue_ create_queue()
{
queue_ q = (queue_)malloc(sizeof(queue_node));
q->rear=q->front_=-1;
return q;
}
int empty_(queue_ q)
{
if(q->front_==q->rear)return 1;
return 0;
}
int full(queue_ q)
{
if( (q->rear+1)%MAXSIZE == q->front_ )return 1;
return 0;
}
//出队列
void pop(queue_ q)
{
q->front_ = (q->front_+1)%MAXSIZE;
}
//入队列
void push(queue_ q,datatype d)
{
q->data[q->rear]=d;
q->rear = (q->rear+1)%MAXSIZE;
}
datatype top(queue_ q)
{
return q->data[q->front_];
}
int main()
{
queue_ q = create_queue();
printf("队列判空结果为:%d\n",empty_(q));
printf("顺序将7,4,5加入队列\n");
push(q,7);//1
push(q,4);//2
push(q,5);//3
printf("队首元素为:%d\n",top(q));
printf("队列判空结果为:%d\n",empty_(q));
push(q,11);//4
push(q,2);//5
printf("顺序将11,2加入队列\n");
printf("队首元素为:%d\n",top(q));
pop(q);//4
printf("出队列一次\n");
printf("队首元素为:%d\n",top(q));
pop(q);//3
pop(q);//2
printf("出队列两次\n");
printf("队首元素为:%d\n",top(q));
push(q,10);//3
push(q,11);//4
push(q,12);//5
push(q,13);//6
push(q,14);//7
push(q,15);//8
push(q,16);//9
printf("顺序将10~16加入队列\n");
printf("队首元素为:%d\n",top(q));
return 0;
}