//用链栈实现链队列逆置
//Wpl
#include "linkstack.h" //将链栈基本操作包括进来
typedef struct node /*定义链队列结点类型*/
{
datatype data;
struct node *next;
}linkqueue;
typedef struct /*封装队头指针和队尾指针*/
{
linkqueue *front; /*定义队头指针*/
linkqueue *rear; /*定义队尾指针*/
}Lqueue;
//链队列的初始化
Lqueue *InitQueue()
{
Lqueue *Q;
linkqueue *q;
Q=(Lqueue *)malloc(sizeof(Lqueue)); //为链队列类型分配空间
q=(linkqueue *)malloc(sizeof(linkqueue));
if(!Q)
printf("内存空间不足\n"); /*存储分配失败*/
else
{
q->next=NULL;
Q->rear=Q->front=q; //注意此处初始化时q而不是NULL
}
return Q;
}
//入队列
Lqueue *EnQueue(Lqueue *Q, datatype x)
{
linkqueue *p; //定义一个链表接点指针
p=(linkqueue *)malloc(sizeof(linkqueue));/*开辟新链表结点*/
if(!p)
printf("内存空间不足\n"); /*存储分配失败*/
else
{
p->data=x; //就是建立链表时候的尾插法
p->next=NULL;
Q->rear->next=p; //把新插入接点放在队尾
Q->rear=p; //移动队尾指针
}
return Q;
}
//出队列
datatype DeQueue(Lqueue *Q)
{
datatype y;
linkqueue *p;
if(Q->rear==Q->front) //或者Q->front和Q->rear为空也可以判断链队列为空
{
return 0;
}
else
{
p=Q->front->next;
y=p->data; /*队头元素出队,存入y中*/
Q->front->next=p->next; /*队头指针后移*/
if(Q->rear==p) /*原来只有一个结点,出队后为空队列*/