两个栈实现双端队列

一个笔试题,当时竟然没想出来,现在实现下

  1 /*
  2 用两个栈实现双端队列
  3 栈s1,s2。
  4 pushback()和popback(),必须在s2为空的情况,把s2的都放s1中
  5 pushfront()和popfront(),必须是在s1为空,把s1的都给放到s2中
  6 */
  7 #include <iostream>
  8 #include <stack>
  9 using namespace std;
 10 template <typename T>
 11 class DequeBy2Stack
 12 {
 13 private:
 14     int maxsize;
 15     stack<T> s1;
 16     stack<T> s2;
 17 public:
 18     DequeBy2Stack(int size):maxsize(size){}
 19     void pushback(T n);
 20     T popback();
 21     void pushfront(T n);
 22     T popfront();
 23     int size();
 24     bool empty();
 25 };
 26 template <typename T>
 27 bool DequeBy2Stack<T>::empty()
 28 {
 29     return s2.empty()&&s1.empty();
 30 }
 31 template <typename T>
 32 int DequeBy2Stack<T>::size()
 33 {
 34     return s1.size()+s2.size();
 35 }
 36 template <typename T>
 37 void DequeBy2Stack<T>::pushback(T n)
 38 {
 39     if(this->size()==maxsize)
 40     {
 41         throw new std::exception("Invalid push");
 42     }
 43     while(!s2.empty())           //必须将s2中的数据都导入到s1中
 44     {
 45         int tmp=s2.top();
 46         s1.push(tmp);
 47         s2.pop();
 48     }
 49     s1.push(n);
 50 }
 51 template <typename T>
 52 T DequeBy2Stack<T>::popback()
 53 {
 54     while(!s2.empty())
 55     {
 56         int tmp=s2.top();
 57         s1.push(tmp);
 58         s2.pop();
 59     }
 60     if(!s1.empty())
 61     {
 62         int tmp=s1.top();
 63         s1.pop();
 64         return tmp;
 65     }
 66     else
 67     {
 68         throw new exception("Invalid popback()");
 69     }
 70 }
 71 template <typename T>
 72 void DequeBy2Stack<T>::pushfront(T n)
 73 {
 74     if(this->size()==maxsize)
 75     {
 76         throw new std::exception("Invalid push");
 77     }
 78     while(!s1.empty())
 79     {
 80         int tmp=s1.top();
 81         s2.push(tmp);
 82         s1.pop();
 83     }
 84     s2.push(n);
 85 }
 86 template <typename T>
 87 T DequeBy2Stack<T>::popfront()
 88 {
 89     while(!s1.empty())
 90     {
 91         int tmp=s1.top();
 92         s2.push(tmp);
 93         s1.pop();
 94     }
 95     if(!s2.empty())
 96     {
 97         int tmp=s2.top();
 98         s2.pop();
 99         return tmp;
100     }
101     else
102     {
103         throw new exception("Invalid popfront");
104     }
105 }
106
107 int main()
108 {
109     DequeBy2Stack<int> test(8);
110     int n;
111     for(int i=1;i<=8;i++)
112     {
113         test.pushback(i);
114     }
115     test.popback();
116     test.popfront();
117     test.popfront();
118     test.popfront();
119     test.pushfront(100);
120     test.pushfront(101);
121     test.pushback(30);
122     test.pushfront(102);
123     test.popfront();
124     while(!test.empty())
125         cout<<test.popback()<<endl;
126     system("pause");
127 }
128         
时间: 2024-10-18 22:34:52

两个栈实现双端队列的相关文章

《算法实战策略》-chaper19-队列、栈和双端队列

对于计算机专业的学生来说,他们一定会很熟悉一句话:程序设计 = 算法 + 数据结构.而根据笔者的理解,所谓程序设计其实就是为了编程解决实际问题,所谓算法是一种解决问题某种思维的方法,但是思维需要得到编程实践,这就需要基于数据结构.一个好的数据结构能够让我们更快更高效得处理数据,有些模拟性.数学背景并不深厚的的问题,仅仅基于高效的数据结构就可以解决.那么这一章节,我们就单独将队列.栈.双端队列拿出来,结合具体的题目,看看它们是如何灵活的运用到解题策略当中的. 考虑到笔者在<入门经典>和<啊

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

数据结构 --- 01. 时间复杂度,timeit模块,栈,队列,双端队列

一.时间复杂度 1.基本概念 评判程序优劣的方法: 消耗计算机资源和执行效率(无法直观) 计算算法执行的耗时(适当推荐,因为会受机器和执行环境的影响) 时间复杂度(推荐) 时间复杂度 评判规则:量化算法执行的操作/执行步骤的数量 最重要的项:时间复杂度表达式中最有意义的项 大O记法:O(时间复杂度表达式中最有意义的项) 常见的时间复杂度: O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O

[程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(双端队列)

题目 给定数组arr和整数num,求数组的子数组中有多少个的满足"最大值减去最小值<=num". 解题思路 分析题目,有结论: 如果数组arr[i...j]满足条件,则它的每一个子数组都满足条件. 如果数组arr[i...j]不满足条件,则包含它的每一个数组都不满足条件. 数据结构:用i.j表示当前窗口,分别使用两个双端队列维护窗口的最大值和最小值. 具体地,每次更新两个双端队列,检查当前的窗口是否满足条件,满足则j++,不满足则cnt+=j-i,更新双端队列,i++,j不变.若

[程序员代码面试指南]栈和队列-生成窗口最大值数组(双端队列)

问题描述 输入数组arr={4,3,5,4,3,3,6,7},窗口大小w=3,窗口由左向右移动,输出每个窗口最大值组成的数组. 解题思路 数据结构:使用ArrayList模拟双端队列. 遍历一遍arr,时间复杂度O(n).具体地, 队列队尾的位置对应的元素若不比当前位置对应元素大,则弹出,否则,将当前元素入队. -每次检查队首元素下标是否已超出以当前位置为结尾的窗口,超出则出队. 代码 import java.util.LinkedList; public class Main { public

算法导论之八(10.1-5单数组实现双端队列)

算法导论第三版P131 题目: 10.1-5 栈插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行.写出4个时间均为O(1)的过程,分别实现在双端队列插入和删除元素的操作,该队列使用一个数组实现的. 注意点: 1.左右端点指向的位置是类似于队列中的tail端点,是下一个插入操作的位置. 2.然后注意遍历的时候,左端点和右端点的位置关系,有两种可能,所以遍历的方式不一样. 代码: /* * 使用单数组

双端队列C实现代码 算法导论10.1-5 10.1-6 10.1-7

数组实现双端队列的时候注意区别判断上溢和下溢. 用两个栈实现队列,就相当于把两个栈底靠在一起(背靠背),一个栈用来出队列,一个栈用来进队列.这个队列的操作时间大部分时候是常数时间,除了出列的栈为空,需要把进列的栈全部转移过去,再出列.Back()操作和Pop()操作类似,也是这样. 而两个队列实现栈,队列轮流充当入栈和出栈的角色,而什么时候会改变角色呢,就是Pop()操作.Pop()操作先把一个队列中的所有元素全部出列并加入另外一个空队列中去,然后再出列(第二个队列). 实现代码为C #incl

经典算法题每日演练——第十九题 双端队列

原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in love,嗨,慢慢调整心态吧, 这篇就选一个简单的数据结构聊一聊,话说有很多数据结构都在玩组合拳,比如说:块状链表,块状数组,当然还有本篇的双端队列,是的,它就是 栈和队列的组合体. 一:概念 我们知道普通队列是限制级的一端进,另一端出的FIFO形式,栈是一端进出的LIFO形式,而双端队列就没有这样的限制级,也就是我们可以在 队列两端进行

6.基本数据结构-双端队列(Deque)

一.双端队列(Deque) - 概念:deque(也称为双端队列)是与队列类似的项的有序集合.它有两个端部,首部和尾部,并且项在集合中保持不变. - 特性:deque 特殊之处在于添加和删除项是非限制性的.可以在前面或后面添加新项.同样,可以从任一端移除现有项.在某种意义上,这种混合线性结构提供了单个数据结构中的栈和队列的所有能力. - 注意:即使 deque 可以拥有栈和队列的许多特性,它不需要由那些数据结构强制的 LIFO 和 FIFO 排序.这取决于你如何持续添加和删除操作. 二.Pyth