首页 > 代码库 > 队列的应用:双端队列
队列的应用:双端队列
双端队列(Deque:double ended queue)就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。相对于普通队列,双端队列的入队和出队操作在两端都可进行。
双端队列的示意图:
left:左端 right:右端
这里我们使用最常用的顺序结构来存储双端队列,为了节省空间,把它首尾相连,构成循环队列。并且规定left指向左端的第一个元素,right指向右端的下一个位置。那么队空的判断则是left==right,队满是(left-1+MAX)%MAX==right或者(right-left+MAX)%MAX==MAX。
详细细节看代码:
类定义和类实现
#include<iostream> #include<iomanip> using namespace std; //队列的最大存储空间为MAX const int MAX = 10; typedef int ElemType; //双端队列类 class Deque //double ended queue { private: int size; //队列中元素个数 ElemType *base; int left, right; //0代表左端left,1代表右端right public: //构造函数 Deque(); //析构 ~Deque() { delete[]base; } //获取大小 int getSize() { return size; } //队空判断 bool empty() { return left == right; } //或者size==0 //队满判断 bool full() { return (left - 1 + MAX) % MAX == right; } //获取指定端的头元素 bool topAt(ElemType&, int); //在指定端插入(入队) bool pushAt(ElemType, int); //在指定端删除(出队) bool popAt(int); //从指定端打印队列 void print(int); //请空队列 void clear(); }; Deque::Deque() { base = new ElemType[MAX]; left = right = 0; size = 0; } bool Deque::topAt(ElemType& data, int end) { if (empty()) return false; if (end == 0) data = http://www.mamicode.com/base[left];>主函数和相关方法:void check(int& end) //对端号进行检查 { while (cin >> end && !(end == 0 || end == 1)) { cout << "端号不对,重新输入:"; } } void input(Deque& deque) //输入函数 { int end; cout << "在指定端入队,0左端,1右端:"; check(end); ElemType data; cout << "输入数据,输入0结束" << endl; while (cin >> data && data) { deque.pushAt(data, end); } } void traverse(Deque& deque) //从指定端遍历 { int end; cout << "从指定端遍历:"; check(end); deque.print(end); } int main() { cout << "******双端队列演练******" << endl; Deque deque; cout << "新建双端队列" << endl; cout << "队列是否为空:"; deque.empty() ? cout << "Yes!" << endl : cout << "No!" << endl; input(deque); traverse(deque); input(deque); traverse(deque); ElemType data; int end; cout << "获取指定定端的头元素:"; check(end); deque.topAt(data, end) ? cout << data << endl : cout << "队空!" << endl; cout << "删除指定定端的头元素:"; check(end); deque.popAt(end) ? cout << "删除成功" << endl : cout << "队空!" << endl; traverse(deque); cout << "清空队列,队列是否为空:"; deque.clear(); deque.empty() ? cout << "Yes!" << endl : cout << "No!" << endl; system("pause"); return 0; }
运行:
若是有所帮助,顶一个哦!
专栏目录:数据结构与算法目录
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。