循環隊列

    頭文件:
   
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define MAXSIZE 100

typedef int elemType;
typedef struct Queue
{
  elemType *base;//動態分配空間基址
  int front;        //標示隊首
  int rear;        //標示隊尾
}Queue,*ptr_Queue;

ptr_Queue Init_Queue(void)
{//初始化一個隊列
  ptr_Queue queue;
  queue=new Queue;
  queue->base=(elemType *)malloc(MAXSIZE * sizeof(elemType));
  if(!queue->base)
  {
    printf("allocation is failed.\n");
    return NULL;
  }
  else
  {
    queue->front=queue->rear=0;
    return queue;
  }
}

bool IsQueueEmpty(ptr_Queue queue)
{//判斷隊列是否爲空
  if(queue->rear==queue->front)
  {
    return true;
  }
  return false;
}

int QueueLength(ptr_Queue queue)
{//獲取隊列的長度
  return ((queue->rear-queue->front+MAXSIZE)%MAXSIZE);
}

bool IsQueueFull(ptr_Queue queue)
{//判斷隊列是否滿了
  if((queue->rear+1)%MAXSIZE==queue->front)
  {
    return true;
  }
  return false;
}

void Enter_Queue(ptr_Queue queue,elemType elem)
{//入隊
  if(IsQueueFull(queue))
  {//隊列已滿,不能再入隊
    printf("The queue is full,there is no room for you to enter a element.\n");
  }
  else
  {
    queue->base[queue->rear]=elem;
    queue->rear=(queue->rear+1)%MAXSIZE;
  }
}

bool Delete_Queue(ptr_Queue queue,elemType *elem)
{
  if(IsQueueEmpty(queue))
  {//空隊列
    printf("The queue is empty,you can't delete element from it.\n");
    return false;
  }
  else
  {
    *elem=queue->base[queue->front];
    queue->front=(queue->front+1)%MAXSIZE;
    return true;
  }
}

bool Position_Elem(ptr_Queue queue,int pos,elemType *elem)
{
  if(pos<1 || pos>QueueLength(queue))
  {
    printf("The position is invalidate.\n");
    return false;
  }
  else
  {
    if(IsQueueEmpty(queue))
    {
      printf("The queue is empty.\n");
      return false;
    }
    else
    {
      *elem=queue->base[pos-1];
      return true;
    }
  }
}

bool Front_Element(ptr_Queue queue,elemType *elem)
{
  if(IsQueueEmpty(queue))
  {
    printf("The queue is empty.\n");
    return false;
  }
  else
  {
    *elem=queue->base[queue->front];
    return true;
  }
}

bool Rear_Element(ptr_Queue queue,elemType *elem)
{
  if(IsQueueEmpty(queue))
  {
    printf("The queue is empty.\n");
    return false;
  }
  else
  {
    *elem=queue->base[queue->rear-1];
    return true;
  }
}

void ClearQueue(ptr_Queue queue)
{
  elemType elem;
  while(queue->front!=queue->rear)
  {
    Delete_Queue(queue,&elem);
  }
}
void VisitQueue(ptr_Queue queue)
{
  int i;
  for(i=queue->front;i!=queue->rear;++i)
  {
    printf("%4d",queue->base[i]);
  }
  printf("\n");
}
    測試代碼:
   
#include "stdafx.h"
#include "sequence_queue.h"
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
  int i;
  int pos;
  elemType elem;
  ptr_Queue queue;
  queue=Init_Queue();
  if(queue)
  {
    printf("We have a new queue.\n");
  }
  printf("The length of the new queue is:%d\n",QueueLength(queue));
  Enter_Queue(queue,5);
  Enter_Queue(queue,8);
  Enter_Queue(queue,11);
  Enter_Queue(queue,25);
  VisitQueue(queue);
  printf("The length of the queue is:%d\n",QueueLength(queue));
  Delete_Queue(queue,&elem);
  VisitQueue(queue);
  printf("The length of the queue is:%d\n",QueueLength(queue));
  Delete_Queue(queue,&elem);
  Delete_Queue(queue,&elem);
  VisitQueue(queue);
  printf("The length of the queue is:%d\n",QueueLength(queue));
  Delete_Queue(queue,&elem);
  Delete_Queue(queue,&elem);
  for(i=0;i<6;++i)
  {
    Enter_Queue(queue,i*3+5);
  }
  VisitQueue(queue);
  printf("The length of the queue is:%d\n",QueueLength(queue));
  printf("Please input the position:");
  scanf("%d",&pos);
  if(Position_Elem(queue,pos,&elem))
  {
    printf("The elem at the position %d is %d\n",pos,elem);
  }
  if(Front_Element(queue,&elem))
  {
    printf("The front_elem is %d\n",elem);
  }
  if(Rear_Element(queue,&elem))
  {
    printf("The rear_elem is %d\n",elem);
  }
  ClearQueue(queue);
  Delete_Queue(queue,&elem);
  getch();
  return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章