数据结构--队列的思想与数组实现

     队列和栈一样,也是一种表,和栈不同的是队列的插入在一端进行而删除操作在另一端进行,因此队列是一种先进先出的表,队列的基本操作是入队(Enqueue),他是在表的末端(叫做队尾(rear))插入一个元素,还有出队(Dequeue),他是删除或者返回在表的开头(叫做队头(front))的元素,但这样会存在一个问题,假如一个列队的大小为10,当执行10次入队操作和9次出队操作后,队列似乎满了,因为最后一个元素放在了数组的最后一个位置,再执行入队操作将造成数组的溢出(虽然最后一个元素前面都是空的),一个简单的解决方法是只要Front或者Rear到达数组的尾端,他就绕回到开头,这叫做队列循环数组的实现。

 

    队列用数组实现的代码如下:

#include <iostream>
using namespace std;

typedef struct QueueRecord *Queue;
#define MinQueueSize  10
struct QueueRecord
{
   int Capacity;    //队的容量
   int Front;       //队头
   int Rear;        //队尾
   int Size;        //队中元素的个数
   int *Array;       //数组
};
///////////////////函数声明////////////////////////
int IsEmpty(Queue Q);    //判断队列是否为空
int IsFull(Queue Q);     //判断队列是否满了
void MakeEmpty(Queue Q);   //构造一个空列队
Queue CreateQueue(int MaxElements);  //创建一个列队
void DisposeQueue(Queue Q);      //释放一个列队
void Enqueue(int x, Queue Q);    //入队
int Dequeue(Queue Q);      //出队
int Front(Queue Q);     //返回队首值,不出队


///////////////////函数定义////////////////////////
int IsEmpty(Queue Q)
{
   return Q->Size == 0;
}

int IsFull(Queue Q)
{
    if(Q->Size > Q->Capacity )
    {
       cout << "queue full" << endl;
       return -1;
    }
    else
    {
       return 0;
    }
}

void MakeEmpty(Queue Q)
{
   Q->Size = 0;
   Q->Front = 1;
   Q->Rear = 0;
}

Queue CreateQueue(int MaxElements)
{
   Queue Q;
   if (MaxElements < MinQueueSize)
   {
      cout << "queue size is too small" << endl;
   }
   Q = static_cast<Queue> (malloc(sizeof(struct QueueRecord)));
   if(Q == NULL)
   {
      cout << "out of space!!!";
   }
   Q->Array =static_cast<int*>(malloc(sizeof(int)*MaxElements));
   if(Q->Array == NULL)
   {
     cout << "out of space!!!";
   }
   Q->Capacity = MaxElements;
   MakeEmpty(Q);
   return Q;
}

void DisposeQueue(Queue Q)
{
    if (Q != NULL)
   {
      free(Q->Array );
      free(Q);
   }
} 


static int Succ(int Value, Queue Q)  //循环数组,用于回绕
{
   if(++Value == Q->Capacity )
       Value = 0;
   return Value;
}
void Enqueue(int x, Queue Q)
{
    if(IsFull(Q))
    {
       cout << "Full queue" << endl;
    }
    else
    {
       Q->Size ++;
       Q->Rear = Succ(Q->Rear, Q);
       Q->Array [Q->Rear] = x;
    }
}


int Dequeue(Queue Q)
{
    if(IsEmpty(Q))
    {
       cout << "Empty Queue" << endl;
       return false;    //仅表示错误
    }
    else
    {
       Q->Size --;
       Q->Front = Succ(Q->Front, Q);
       return Q->Array[(Q->Front)-1];
    }
}

int Front(Queue Q)
{ 
    if(IsEmpty(Q))
    {
       cout << "Empty Queue" << endl;
       return false;    //仅表示错误
    }
    else 
    return Q->Array[Q->Front];
}


int main ()
{
    /////////测试队列/////////////////////
  Queue queue_1 = CreateQueue(15);
  Enqueue(5,queue_1);
  Enqueue(25,queue_1);
  Enqueue(89,queue_1);
 
  cout << Dequeue(queue_1) << endl;
  cout << Dequeue(queue_1) << endl;
  cout << Dequeue(queue_1) << endl;
  cout << Front(queue_1) << endl;

  DisposeQueue(queue_1);

   return 0;
}

  

    和栈这种数据结构一样,队列也可以用链表实现,最重要的还是思想。

 

     夜深了,离天亮似乎不远了。

 

posted on 2017-04-16 21:27  wu_xin  阅读(457)  评论(0编辑  收藏  举报

导航