//顺序队列的类型定义如下:
#define maxsize 1024
typedef struct
{
int data[maxsize];
int rear,front;
}sequeue;
//定义一个指向队列的指针变量 sequeue *q
//申请顺序队列的存储空间 q=(sequeue*)malloc(sizeof(sequeue));
//空队时 q->rear=q->front=-1;
//入队列 q->rear++;q->data[q->rear]=x;
//出队列 q->front++;x=q->data[q->front];//队头指针指向的是队头元素的前面一个位置,就是队头指针没有指向第一个队头元素,但是队尾指针指向的是最后一个队列尾元素,从这一点来看队列头指针与队列尾指针是有点不同的
//队列中元素个数 m=(q-<rear)-(q->front);
//队列就是队列头部出去元素,队列尾部进入元素
//顺序队列会有假溢出的情况,那么构建循环队列就是非常必要的了
typedef struct
{
int data[maxsize];
int front,rear;
int num;//队列中间元素的个数
}csequeue;//循环队列的定义
csqueue *init_sequeue()
{
q=(csequeue*)malloc(sizeof(csequeue));//为q队列申请存储空间
q->rear=q->front=maxsize-1;
q->num=0;
return q;
}//构建空的循环队列
int in_sequeue(csequeue *q,int x)
{
if(q->num==maxsize-1)
{
printf("队满\n");
return -1;
}
else
{
q->rear=(q->rear+1)%maxsize;
q->data[q->rear]=x;
q->num++;
return 1;
}
}//入循环队列
int out_sequeue(csequeue *q,int *x)
{
if(q->num==0)
{
printf("队空\n");
return -1;
}
else
{
q->front=(q->front+1)%maxsize;
*x=q->data[q->front];
q->num--;
return 1;
}
}//出循环队列
int empty_sequeue(csequeue *q)
{
if(q->num==0)
return 1;
else
return 0;
}//判断循环队列是不是空
//////////////////////////////////////////////////////////
typedef struct
{
int data;
struct node *next;
}qnode;//单链表按照队列的操作来的话就是链队列
typedef struct
{
qnode *front,*rear;
}lqueue;//把指向链队列的头指针与尾指针封装在一起
//定义指向链队的指针 lqueue *q
lqueue *init_lqueeu()
{
lqueue *q;//定义头尾指针的封装结点
qnode *p;//定义链队列的头结点
q=(lqueue*)malloc(sizeof(lqueue));//申请存储空间
p=(qnode*)malloc(sizeof(lqueue));//同上
p->next=NULL;
q->front=p;
q->rear=p;
return p;
}//置一个空链队列
void in_lqueue(lqueue *q,int x)
{
qnode *p;
p=(qnode*)malloc(sizeof(qnode));
p->data=x;
p->next=null;
q->rear->next=p;
q->rear=p;
}//链队列入队列
int out_lqueue(lqueue *q,int *x)
{
qnode *p;
if(empty_lqueue(q))
{
printf("队列空\n");
return 0;
}
else
{
p=q->front->next;
q-front->next=p->next;
*x=p->data;
free(p);
if(q->front->next==NULL)
{
q->rear=q->front;
return 1;
}
}
}//链队出队列算法