队列

队列也是一种重要的线性结构。与栈相同,实现一个队列同样需要顺 序表或者链表作为基础。
与栈不同的是,队列是一种先进先出的的线性表。它要求所有的数据从队列的一端进入,从队列的另一端离开。
在队列中,允许插入数据的一端叫队尾,允许数据离开的一端叫队头。

一、队列程序实例

实现一个链队列,任意输入一串字符,以@为结束标志,然后将队列中的元素逐一取出,打印在屏幕上。

#include 

typedef char ElemType;  //将char定义为ElemType

typedef struct QNode
{
  ElemType data;     //数据域
  struct QNode *next;  // 指针域
}QNode , *QueuePtr;

typedef struct 
{
 QueuePtr front;  //队头指针
 QueuePtr rear;  //队尾指针
}LinkQueue;

initQueue(LinkQueue *q)  //初始化一个空队列
{
   q->front = q->rear = (QueuePtr)malloc(sizeof(QNode)); //创建一个头结点,队头队尾指针指向该结点
   if(!q -> front) exit(0); //创建头结点失败
   q->front->next = NULL;  //头结点指针域置NULL 
}

EnQueue(LinkQueue *q, ElemType e)
{
  QueuePtr p;
  p = (QueuePtr)malloc(sizeof(QNode)); //创建一个队列元素结点
  if(!q->front) exit(0);   //创建头结点失败
  p -> data = e;
  p -> next = NULL;
  q -> rear -> next = p;
  q -> rear = p;
}

DeQueue(LinkQueue *q, ElemType *e)
{
  // 如果队列q不为空,删除q的队头元素,用e返回其值
  QueuePtr p;
  if(q->front == q->rear) return;  //队列为空,返回
  p = q->front->next;
  *e = p->data;
  q -> front -> next = p->next;
  if(q->rear == p) q->rear =q->front; //如果队头就是队尾,则修改队尾指针
  free(p);
}

DestroyQueue(LinkQueue *q)
{
  while(q->front)
  {
    q->rear = q->front ->next; //q->rear 指向q->front的后继结点
    free(q->front);  //释放掉q->front
    q->front = q->rear; //q->front后移
  }
}

//测试函数
 int main () 
{ 
  ElemType e;
  LinkQueue q;
  initQueue(&q); //初始化一个队列q*
  printf("please input a string into a queue\n");
  scanf("%c", &e);
  while(e!='@')
  {
    EnQueue(&q, e); //向队列中输入字符串,以@表示结束
    scanf("%c",&e);
  }
  printf("The string into the queue is\n");
  while(q.front != q.rear)  //将队列中的元素出队列,并打印在屏幕上
  {
    DeQueue(&q, &e);
    printf("%c", e);
  }
  printf("\n");
  DestroyQueue(&q);  //销毁队列q
  getche();

   return 0;
}

输出结果:
队列_第1张图片

你可能感兴趣的:(数据结构,队列)