Queue队列的基本功能数组实现
类似地,鉴于STL的队列有或多或少的功能缺失,于是我们就来手写一个队列。
以下是代码,功能有待完善。
1 //数组实现队列的简单操作 2 int q[100001]; 3 int front = 1,rear = 0; 4 5 void Push(int x){ 6 q[++rear] = x; 7 } 8 9 void Pop(){ 10 ++front; 11 } 12 13 int Query(int k){ //询问第k个元素 14 //如何判断队列里有几个元素? rear - front + 1即可 15 return q[front+k-1]; 16 } 17 int Top(){ 18 return q[front]; 19 }
不仅如此,我们经常还会用到循环队列,这边一并给出:
1 //数组实现循环队列 2 //有些时候 入队出队次数远远大于队伍的元素个数,那么开很大的数组就浪费空间了 3 //于是我们就让 当队尾指针移动到数组末端时,再将其移动到数组头即可,反之亦然 4 const int size = 1001; //size要严格大于队列最长的时候的长度 5 int q[size+1]; 6 int front = 1,rear = size; 7 8 void Push(int x){ 9 rear = rear % size + 1; 10 q[rear] = x; 11 return; 12 } 13 14 void Pop(){ 15 front = front % size + 1; 16 return; 17 } 18 19 bool Empty(){ 20 return rear % size + 1 == front; 21 } 22 23 int Query(int x){ 24 if (front + x - 1 <= size){ 25 return q[front + x - 1]; 26 } 27 else{ 28 return q[front + x - 1 - size]; 29 } 30 }
STL的常用方法也给出(STL队列真真不常用):
1 //先进先出FIFO 2 //只允许在后端rear插入,在前端front删除 3 //queue普通队列 o(1) 4 queue<int> que; 5 que.push(1); //入队 6 que.pop(); //出队 7 que.empty(); 8 que.size(); 9 que.front(); //返回队头元素 10 que.back(); //返回队尾元素 11 //队列没办法像list一样用迭代器遍历,只能出队实现