数据结构|队列的实现[6]

队列

队列的特性是先进先出。每次数据出去只能的队列的头部,每次数据进来只能加在队列的尾部。
队列实现一般有两种方式,线性队列,链表队列。

链表队列

链表队列的实现可以参考单向链表。先建立一个普通的单向链表,然后设置三个属性。队列头,用来标识当前队列头的地址;队列尾,用来标识队列尾的地址;队列长,记录当前的队列长,理论上不给队列设置长度可以无限扩展。
每次删除数据,就把队列头的标识移到下一个node的地址。每次增加数据则就把队列尾的指针指向的node加上下一个node的地址,同时把队列尾的标识移过去即可。

线性队列

超简单的,基于数组实现,每次删除数据则把数组第一个删除,把后续的往前面移动,最后一个直接置空;添加数据只需要在最后继续添加即可;数组会有定长,删除和添加数据一定要检验。下面是一个简单地线性队列。

#include <iostream>
using namespace std;
typedef struct queue
{

   int data[10];
   int length;
   int rear;
} queue;
queue add_num(queue q, int num)
{
   if (q.length + 1 <= 10)
   {
       q.data[q.length] = num;
       q.length += 1;
   }
   else if (q.length + 1 > 10)
   {
       cout << "error";
   }

   return q;
};
queue rm_head(queue q)
{
   if (q.length - 1 >= 0)
   {
       for (int i = 0; i < q.length - 1; i++)
       {
           q.data[i] = q.data[i + 1];
       }
       q.data[q.length - 1] = -1;
       q.length -= 1;
   }
   else if (q.length - 1 < 0)
   {
       cout << "error";
   }
   return q;
};

int main()
{
   queue q;
   q.length = 0;
   q = add_num(q, 10);
   q = add_num(q, 9);
   q = add_num(q, 8);
   q = add_num(q, 7);
   for (int i = 0; i < q.length; i++)
   {
       cout << q.data[i] << endl;
   };
   q = rm_head(q);
   q = rm_head(q);
   for (int i = 0; i < q.length; i++)
   {
       cout << q.data[i] << endl;
   };
   q = add_num(q, 10);
   q = add_num(q, 9);
   for (int i = 0; i < q.length; i++)
   {
       cout << q.data[i] << endl;
   };
   return 0;
}


猜你喜欢

转载自blog.51cto.com/15069488/2578602