两个栈实现双端队列

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

  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         

 

转载于:https://www.cnblogs.com/zmlctt/p/3985128.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java web 打印方案---数飞OA打印方案总结

Web系统中&#xff0c;打印功能一直是个老大难问题&#xff0c;因此产生了很多第三方的控件&#xff0c;多数要收费&#xff0c;而且跟自己的系统结合有一定的麻烦。数飞OA系统采用J2EE技术&#xff0c;jsp打印问题同样存在于OA中。 在数飞OA中&#xff0c;打印方式有三种&…

Linux ftp ldap认证,vsftpd+ldap认证

一、环境系统 CentOS 6.4x64最小化安装IP 192.168.3.19二、安装ldap[roottest ~]# yum install openldap openldap-* -y[roottest ~]# yum install nscd nss-pam-ldapd nss-* pcre pcre-* -y配置ldap[roottest ~]# cd /etc/openldap/[roottest openldap]# cp /usr/sha…

es6-变量的解构赋值

从数组和对象中提取值&#xff0c;对变量进行赋值&#xff0c;这被称为解构 let [foo, [[bar], baz]] [1, [[2], 3]]; foo // 1 bar // 2 baz // 3let [ , , third] ["foo", "bar", "baz"]; third // "baz"let [x, , y] [1, 2, 3];…

浏览器的渲染原理

看到这个标题大家一定会想到这篇神文《How Browsers Work》&#xff0c;这篇文章把浏览器的很多细节讲得很细&#xff0c;而且也被翻译成了中文。为什么我还想写一篇呢&#xff1f;因为两个原因&#xff0c; 1&#xff09;这篇文章太长了&#xff0c;阅读成本太大&#xff0c;不…

AO 直接调用GeoProcessing 工具

Geoprocessing是ArcGIS的一个基础组成部分。无论你是一个新手抑或老资格的专家&#xff0c;geoprocessing都是你使用ArcGIS完成每天工作的一部分。它提供了数据分析、数据管理和数据转换等对于所用GIS用户都必须的工具&#xff0c;当然也包括ArcObjects开发者。GIS程序通常需要…

Linux环境变量PSI指什么,PSI 文件扩展名: 它是什么以及如何打开它?

了解 PSI 问题常见的 PSI 打开问题缺少 PrimalScript双击你的 PSI 文件会提示消息 “%%os%% 无法打开 PSI 文件”。 通常&#xff0c;%%os%% 中会出现这种情况&#xff0c;因为 PrimalScript 未安装在你的电脑上。 由于您的操作系统不知道如何处理此文件&#xff0c;因此无法通…

linux 修改文件时间

1、ls -l *.sh 2、touch -d "10/13/2013" *.sh 【我想把所以的.sh文件修改到三个月前&#xff08;2013年10月13&#xff09;的时间。】3、ls -l *.sh 参考文章 http://blog.itpub.net/29283412/viewspace-1070106/ 另外也可以单独修改时间或者月份&#xff0c;如下以…

datetime模块日期转换和列表sorted排序

import datetime dt 2019010103 # 日期 2019年1月1日3时 dts (datetime.datetime.strptime(dt, %Y%m%d%H) datetime.timedelta(days-1)).strftime(%Y%m%d%H) # 将dt向前或向后调整&#xff08;day表示天&#xff0c;hours表示表示小时&#xff0c;负数往前正数往后&#xf…

差距

现在看明白了自己的距离&#xff0c;该从何处下手&#xff1f; 时间是怎么争取出来的&#xff1f;转载于:https://www.cnblogs.com/rosion/archive/2009/04/11/1433450.html

linux 命令tf,Linux文件管理命令

本篇涉及命令&#xff1a;cat,tac,more,less,head,tail,file,stat,touch,which,whatis,whereis,ls,mkdir,rmdir,tree,cp,mv,rm文本文件查看类命令cat 查看文件内容(concatenate)cat命令用于查看一个或多个文本文件内容&#xff0c;可以将两个或两个以上的文件连接起来并显示&am…

Python实现——二元线性回归(最小二乘法)

2019/3/30二元线性回归——矩阵公式法_又名&#xff1a;对于python科学库的糟心尝试_ 二元线性回归严格意义上其实不过是换汤不换药&#xff0c;我对公式进行推导&#xff0c;其实也就是跟以前一样的求偏导并使之为零&#xff0c;并且最终公式的严格推导我大概也只能说是将将理…

CSharp设计模式读书笔记(18):中介者模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)...

中介者模式(Mediator Pattern)&#xff1a;用一个中介对象&#xff08;中介者&#xff09;来封装一系列的对象交互&#xff0c;中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互&#xff0c;中介者模式又称为调停…

AT命令解释

一、 AT命令解释&#xff1a;1、常用操作1.1 AT命令解释&#xff1a;检测Module与串口是否连通&#xff0c;能否接收AT命令&#xff1b;命令格式&#xff1a;AT<CR>命令返回&#xff1a;OK (与串口通信正常)&#xff08;无返回&#xff0c;与串口通信未连通&#xff09;测…

linux四种集群是什么,lvs四种集群特点及使用场景

一、 前言当一组服务器在高速的局域网或广域网中相互连接&#xff0c;其前端部署了一个负责负载调度的调度器(Director)的服务器系统。调度器能将网络请求无缝调度到真实服务器上(Real server)&#xff0c;客户访问集群系统提供的网络服务就像访问一台高性能、高可用的服务器一…

c#数据库訪问返回值类型为SqlDataReader时使用using时注意的问题

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主同意不得转载。https://blog.csdn.net/u010512579/article/details/24011761 在封装通用 SQLSERVER 数据可訪问方法时&#xff0c;假设返回值类型为 SqlDataReader ,那么在创建连接字符串的时候。我们不能写成例如以…

BroadcastReceiver应用详解(转)

转自&#xff1a; http://blog.csdn.net/liuhe688/article/details/6955668 問渠那得清如許&#xff1f;為有源頭活水來。南宋.朱熹《觀書有感》 据说程序员是最爱学习的群体&#xff0c;IT男都知道&#xff0c;这个行业日新月异&#xff0c;必须不断地学习新知识&#xff0c;不…

深入浅出JSON

深入浅出JSON JSON定义 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;易于阅读和编写&#xff0c;同时也易于机器解析和生成。它基于ECMA262语言规范&#xff08;1999-12第三版&#xff09;中JavaScript编程语言的一个子集。 JSON采用与编程语言…

就linux学习的一点感受,学习linux的体会

学linux的驱动设计一&#xff1a;首先先装个虚拟机吧&#xff0c;我觉得这个比较好&#xff0c;有些人建议直接装在硬盘上(我想他们是觉得有点环境压力吧)&#xff0c;可我觉得对于没有linux基础的还是先装虚拟机比较好。二&#xff1a;记住一些常用的命令&#xff0c;这个是学…

自动绑定数据源

自动绑定数据源实现数据控件与原始数据的绑定是实现数据展示与编辑的基本前提。在常规的设计模式下实现数据绑定有两种方式&#xff1a;1&#xff09;第一种方式&#xff1a;在窗体上引用数据对象→逐个拖放控件→分别设置控件与字段的绑定关系。这无疑是个不厌其烦的重复过程&…

Java工具类——通过配置XML验证Map

Java工具类——通过配置XML验证Map 背景 在JavaWeb项目中&#xff0c;接收前端过来的参数时通常是使用我们的实体类进行接收的。但是呢&#xff0c;我们不能去决定已经搭建好的框架是怎么样的&#xff0c;在我接触的框架中有一种就是通过Map来接收前端过来的所有参数&#xff0…