#include<stdio.h>
#include<stdbool.h>
#define MaxSize 50
#define ElemType char
typedef struct{
ElemType data[MaxSize];
int front,rear;
}SqQueue;
typedef struct{
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
void InitQueue(SqQueue *Q){
Q->rear = Q->front = 0;
}
void InitLinkQueue(LinkQueue *Q){
Q->front = (LinkNode*)malloc(sizeof(LinkNode));
Q->rear = Q->front;
Q->front->next = NULL;
}
bool isEmpty(SqQueue Q){
if(Q.rear == Q.front)
return true;
else
return false;
}
bool isLinkEmpty(LinkQueue Q){
if(Q.front == Q.rear)
return true;
else
return false;
}
bool EnQueue(SqQueue *Q,ElemType x){
if((Q->rear+1)%MaxSize == Q->front)
return false;
Q->data[Q->rear] = x;
Q->rear = (Q->rear + 1) % MaxSize;
return false;
}
void EnLinkQueue(LinkQueue *Q,ElemType x){
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
Q->rear->next = s;
Q->rear = s;
}
bool DeQueue(SqQueue *Q,ElemType *x){
if(Q->rear == Q->front)
return false;
*x = Q->data[Q->front];
Q->front = (Q->front + 1) % MaxSize;
return true;
}
bool DeLinkQueue(LinkQueue *Q,ElemType *x){
if(Q->front == Q->rear)
return false;
LinkNode *p = Q->front->next;
*x = p->data;
Q->front->next = p->next;
if(Q->rear == p)
Q->rear = Q->front;
free(p);
return true;
}
void QueuePrintf(SqQueue Q){
ElemType x;
while(!isEmpty(Q)){
DeQueue(&Q,&x);
printf("%c",x);
}
}
void QueueLinkPrintf(LinkQueue Q){
ElemType x;
while(!isLinkEmpty(Q)){
DeLinkQueue(&Q,&x);
printf("%c",x);
}
}
int main(){
SqQueue sq;
LinkQueue linkSq;
ElemType c;
InitQueue(&sq);
printf("建立顺序存储的队列");
printf("请输入要入队的元素回车,以'0'结束\n");
scanf("%c",&c);
while(c != '0'){
EnQueue(&sq,c);
scanf("%c",&c);
}
printf("您建立的队列为:\n");
QueuePrintf(sq);
InitLinkQueue(&linkSq);
printf("建立链式存储的队列");
printf("请输入要入队的元素回车,以'0'结束\n");
scanf("%c",&c);
while(c != '0'){
EnLinkQueue(&linkSq,c);
scanf("%c",&c);
}
printf("您建立的链式队列为:");
QueueLinkPrintf(linkSq);
}