[DS&A]队列
来源:互联网 发布:java第三方登录接口 编辑:程序博客网 时间:2024/06/06 01:07
队列实现:1.使用链表类的组合实现
2.使用数组实现(循环)。
下面提供了第二种实现,注意首尾下标的增减公式,另:为什么size()中计算队列的有效个数公式,在下列情况(满队)失效。
//数组实现队列--循环队列#include<iostream>using namespace std;const int Max = 5;typedef int T;class queue{private: T arr[Max]; int front,rear; //front指向队首前一个位置,rear指向队尾元素 bool flag; //标志位,区别满队和空队 public: queue(); queue& Enqueue(T data); T Dequeue(); bool Qempty(); bool Qfull(); int size(); void clear(); void travel(); };queue::queue():front(0),rear(0),flag(0){}queue& queue::Enqueue(T data){ if(Qfull()) {cout << "队满,无法添加" << endl;return (*this); } rear = (++rear)%Max; arr[rear] = data; flag = 1; return (*this);}T queue::Dequeue(){ if(Qempty()) {cout << "队空!无法删除" << endl;return 0; } T data = arr[front + 1]; front = (++front)%Max; flag = 0; return data;}bool queue::Qempty(){ if((front == rear)&& !flag)//当flag=0时说明上次操作是出队return 1; return 0;}bool queue::Qfull(){ if((front == rear)&& flag)return 1; return 0;}int queue::size(){ if(Qfull()) return Max; //当队列满的时候不符合公式? return (Max+rear-front)%Max;}void queue::clear(){ flag = 0; //设置flag表示出队操作 rear = front = 0; return;}void queue::travel(){ if(Qempty()) {cout << "队空!无法遍历"<< endl;return ; } int f= (front+1)%Max,cnt = size(); for(int i = 0; i < cnt; i++) {cout << arr[f] << " ";f= (f+1)%Max; } cout << endl; return; }int main(){ queue q; q.Enqueue(5).Enqueue(4).Enqueue(3).Enqueue(2).Enqueue(1); q.travel(); q.Enqueue(0); cout << q.Dequeue() << endl << "出队后:"; q.travel(); q.clear(); cout << "清队后:" ; q.travel(); return 0;}
输出结果:
0 0
- [DS&A]队列
- [DS&A]单链表类
- [DS&A]栈
- [DS&A]二叉排序树
- [DS&A]二分法查找
- ds作业(优先队列&贪心)
- [DS&A]基本排序比较
- ds 11.4 Fresh_Meat (优先队列+贪心)
- ds
- ds
- ds
- ds
- ds
- DS
- ds
- ds
- ds
- ds
- c++ map 的基本用法
- 回车实现方式:Carriage Return in PeopleCode
- UVa 167 - The Sultan's Successors 递归回溯
- java map
- Windows上面读磁盘分区表
- [DS&A]队列
- Spring-Hibernate
- Spring声明式事务配置管理方法[很详细]
- 编程之美:1的数目
- 用 Python 脚本实现对 Linux 服务器的监控
- ios开发 真机调试一条龙
- notifyDataSetChanged() 动态更新ListView
- ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结
- java.util.concurrent详解