c++数组实现循环队列
2016-05-23 19:01
369 查看
像栈一样,队列(queue)也是表。然而,使用队列时插入在一端进行而删除则在另一端进行,也就是先进先出(FIFO)。队列的基本操作是EnQueue(入队),它是在表的末端(叫做队尾(rear))插入一个元素;还有DeQueue(出队),它是删除(或返回)在表的开头(叫做队头(front))的元素。
可用具有N个元素的数组Q实现一个队列,front和rear分别表示队首和队尾,N表示数组的大小即队列的容量
初始状态:front=rear=0
如果反复对某个元素执行入队和出队操作,N次后,front=rear=N,此时向队列插入一个元素,就会发生数组越界错误,而此时队列中实际上没有元素,为了避免这个问题,令front和rear的下标在队列的末尾绕回,即把它看做“循环数组”可从Q[0]到Q[N-1],然后再回到Q[0]
计算队列种元素个数的公式:(N-front+rear)%N
注意一种情况:向队列插入N个对象,而不进行删除操作,用公式计算出队列的大小竟然为0,为了避免,可以规定Q最多存放N-1个对象。
同样,队列也可以由链表或数组实现,特点分析如下:(时空矛盾)
链表:不需要设定空间大小,也不会浪费空间;插入或删除时需要动态分配或删除内存,比较耗时;不支持随机存取;
数组:需要预知需要空间的大小,会造成空间浪费或不够用;插入或删除不需要动态分配或删除内存,耗时很小;支持随机存取。
另外,队列又有链式队列和循环队列两种。本文用数组实现的循环队列(当数组空间够大时,链式队列和循环队列是一样的)。
可用具有N个元素的数组Q实现一个队列,front和rear分别表示队首和队尾,N表示数组的大小即队列的容量
初始状态:front=rear=0
如果反复对某个元素执行入队和出队操作,N次后,front=rear=N,此时向队列插入一个元素,就会发生数组越界错误,而此时队列中实际上没有元素,为了避免这个问题,令front和rear的下标在队列的末尾绕回,即把它看做“循环数组”可从Q[0]到Q[N-1],然后再回到Q[0]
计算队列种元素个数的公式:(N-front+rear)%N
注意一种情况:向队列插入N个对象,而不进行删除操作,用公式计算出队列的大小竟然为0,为了避免,可以规定Q最多存放N-1个对象。
同样,队列也可以由链表或数组实现,特点分析如下:(时空矛盾)
链表:不需要设定空间大小,也不会浪费空间;插入或删除时需要动态分配或删除内存,比较耗时;不支持随机存取;
数组:需要预知需要空间的大小,会造成空间浪费或不够用;插入或删除不需要动态分配或删除内存,耗时很小;支持随机存取。
另外,队列又有链式队列和循环队列两种。本文用数组实现的循环队列(当数组空间够大时,链式队列和循环队列是一样的)。
//这是c++用数组实现一个循环队列, #include using namespace std; template class queue { private: int front;//对尾的下标 int rear; int Maxsize; T *q; public: queue(int Msize) :Maxsize(Msize)//:作用是MAXSZE变量的初始化 { q = new T[Maxsize];//q指向分配的数组首地址,也就是数组名 front = rear = 0; } ~queue(){ delete q; } int size(){ return (rear - front + Maxsize) % Maxsize; } bool enqueue(const T& v) { if (size() == Maxsize) { cout << "队列已满" << endl; return false; } else { q[rear] = v;//这里有一些别扭,指针竟然可以作为数组的下标 rear = (rear + 1) % Maxsize; return true; } } int dequeue(T v) { if (size() == 0) { cout << "队列空" << endl; return 0; } else { v=q[front]; q[front] = NULL; front = (front + 1) % Maxsize;//因为是数组所以不需要释放,只需令其值为Null return v; } } }; int main() { char m; queue q1(20); cout << "输入a入队,b出队,c退出!" << endl; cin >> m; while (m != 'c') { if (m == 'a') { int i,j; cout << "输入20以下的数字,即需要入队的个数:"; cin >> i; for (j = 0; j < i; j++) { int k; cin >> k; q1.enqueue(k); cout << "这是当前队列中的元素个数:" << q1.size() << endl; } cout << "队满,请输入b进行出队操作或输入c退出!" << endl; cin >> m;//为了使操作连续 } if (m == 'b') { while (q1.size() != 0) { int n; cout << "请输入你要出队元素赋给哪个数字(注:队列中必须存在)" << endl; cin >> n; cout <<" 出队元素赋给输入的数字,即n=" << q1.dequeue(n) << endl; cout << "这是当前队列中的元素个数" << q1.size() << endl; } cout << "请先输入a:入队一些元素,或输入c退出操作!" << endl; cin >> m;//为了使操作连续 } } }
相关文章推荐
- C++第6次实验-分离数组
- C++中的STL中map用法详解
- C++中的STL中map用法详解(1)
- (C++)int,char,string之间的一些转换
- 详解C结构体、C++结构体 和 C++类的区别
- C++整型和浮点型变量
- C++第六次作业
- c++实验6--数组操作
- 从零开始学习C语言
- 从零开始学习C语言 源代码
- C++指针数组与数组指针的比较
- TinyXML2 Tutorial
- c++语言 如何计算二维数组行数和列数
- C++ vector用法
- c++第七次上机作业
- 山东省第六届ACM大学生程序设计竞赛-Square Number(完全平方数)
- leetcode 83 Remove Duplicates from Sorted List C++
- Java与C++的区别
- c中符号位扩展
- c++晚捆绑的实现机制