队列
队列的特性是先进先出。每次数据出去只能的队列的头部,每次数据进来只能加在队列的尾部。
队列实现一般有两种方式,线性队列,链表队列。
链表队列
链表队列的实现可以参考单向链表。先建立一个普通的单向链表,然后设置三个属性。队列头,用来标识当前队列头的地址;队列尾,用来标识队列尾的地址;队列长,记录当前的队列长,理论上不给队列设置长度可以无限扩展。
每次删除数据,就把队列头的标识移到下一个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;
}
网友评论