JZ-C-07

剑指offer第七题:利用两个栈实现队列

 1 //============================================================================
 2 // Name        : JZ-C-07.cpp
 3 // Author      : Laughing_Lz
 4 // Version     :
 5 // Copyright   : All Right Reserved
 6 // Description :利用两个栈实现队列
 7 //============================================================================
 8
 9 #include <iostream>
10 #include <stack>
11 using namespace std;
12 template<typename T> //类模板,typename可替换为class
13 class CQueue {
14 public:
15     CQueue(void); //缺省构造函数
16     ~CQueue(void);
17     void appendTail(const T& node); // 在队列末尾添加一个结点
18     T deleteHead();
19 private:
20     stack<T> stack1;
21     stack<T> stack2;
22 };
23 //对使用类模板的类的函数,都要在前面加上类模板
24 template<typename T> CQueue<T>::CQueue(void) {
25 }
26 template<typename T> CQueue<T>::~CQueue(void) {
27 }
28 /**
29  *队列的插入在队列尾部:此处实现是在stack1里push
30  */
31 template<typename T> void CQueue<T>::appendTail(const T& element) { //这里为什么是&呢?
32     stack1.push(element);
33 }
34 /**
35  * 队列的取出在队列头部:此处实现是根据stack2中的栈顶元素是最先进入队列的元素(通过判断stack2是否为空)
36  */
37 template<typename T> T CQueue<T>::deleteHead() {
38     if (stack2.empty()) {
39         //将stack1全部压入stack2中
40         while (!stack1.empty()) {
41             T& node = stack1.top();
42             stack1.pop();
43             stack2.push(node);
44         }
45     }
46     if (stack2.empty()) { //再次判断,如果stack2栈空,说明队列已空★
47         cout << "队列为空" << endl;
48         throw new exception();
49     }
50     //从stack2中取出栈顶元素
51     T node = stack2.top();
52     stack2.pop();
53     return node;
54 }
55 int main() {
56     CQueue<char> queue;
57     queue.appendTail(‘a‘);
58     queue.appendTail(‘b‘);
59     queue.appendTail(‘c‘);
60     char result1 = queue.deleteHead();
61     queue.appendTail(‘d‘);
62     char result2 = queue.deleteHead();
63     cout<<result1<<endl;
64     cout<<result2<<endl;
65     char result3 = queue.deleteHead();
66     cout<<result3<<endl;
67     char result4 = queue.deleteHead();
68     cout<<result4<<endl;
69 //    char result5 = queue.deleteHead();//队列已为空
70     return 0;
71 }

扩展:利用两个队列实现栈

 1 //============================================================================
 2 // Name        : JZ-C-07.cpp
 3 // Author      : Laughing_Lz
 4 // Version     :
 5 // Copyright   : All Right Reserved
 6 // Description :扩展:利用两个队列实现栈
 7 //============================================================================
 8
 9 #include <iostream>
10 #include <queue>
11 using namespace std;
12 template<typename T> //类模板,typename可替换为class
13 class CStack {
14 public:
15     CStack(void); //缺省构造函数
16     ~CStack(void);
17     void appendHead(const T& node); // 入栈
18     T deleteHead(); //出栈
19 private:
20     queue<T> queue1;
21     queue<T> queue2;
22 };
23 //对使用类模板的类的函数,都要在前面加上类模板
24 template<typename T> CStack<T>::CStack(void) {
25 }
26 template<typename T> CStack<T>::~CStack(void) {
27 }
28 /**
29  *入栈:此处实现是判断两个队列哪个为不为空(为空的队列用来出栈,交替使用)
30  */
31 template<typename T> void CStack<T>::appendHead(const T& element) { //这里为什么是&呢?
32     if (!queue1.empty()) {
33         queue1.push(element);
34     } else {
35         queue2.push(element); //默认第一次入栈插入第二个队列
36     }
37 }
38 /**
39  * 出栈:此处实现是将某个不为空的队列除最后一个元素全部出队列并插入另一个队列中
40  */
41 template<typename T> T CStack<T>::deleteHead() {
42     if (queue1.empty() && queue2.empty()) {
43         cout << "栈已为空,错误!" << endl;
44         throw new exception();
45     } else if (!queue1.empty()) {
46         while (queue1.size() > 1) {
47             T& node = queue1.front();
48             queue1.pop();
49             queue2.push(node);
50         }
51         T& node = queue1.front(); //将最后压入的元素出栈,出栈后queue1为空
52         queue1.pop();
53         return node;
54     } else if (!queue2.empty()) {
55         while (queue2.size() > 1) {
56             T& node = queue2.front();
57             queue2.pop();
58             queue1.push(node);
59         }
60         T& node = queue2.front(); //将最后压入的元素出栈,出栈后queue2为空
61         queue2.pop();
62         return node;
63     }
64     return 0;//并没意义
65 }
66 int main() {
67     CStack<char> stack;
68     stack.appendHead(‘a‘);
69     stack.appendHead(‘b‘);
70     stack.appendHead(‘c‘);
71     stack.appendHead(‘d‘);
72     char result1 = stack.deleteHead();
73     cout << result1 << endl;
74     stack.appendHead(‘e‘);
75     char result2 = stack.deleteHead();
76     cout << result2 << endl;
77     char result3 = stack.deleteHead();
78     cout << result3 << endl;
79     char result4 = stack.deleteHead();
80     cout << result4 << endl;
81     char result5 = stack.deleteHead();
82     cout << result5 << endl;
83 //    char result6 = stack.deleteHead();//栈已为空
84 //    cout << result6 << endl;
85     return 0;
86 }
时间: 2024-10-29 03:27:52

JZ-C-07的相关文章

程序演义第一一回 撒旦变脸并不可怕,本质亦须真知来抓

2.11 上一节见识了一下神医扁鹊兄弟三人的胖瘦,现在,我们再来看看西方一位以作恶而昭著的人物--它就是撒旦.本回的目的是说明,看问题要把握其实质,抓住这一点,问题就好解了.抓实质是可以学到的. 2.11.1 P11撒旦变脸 图:撒旦虚心听取玩变脸败因 撒旦(Satan),西方神话宗教人物,上帝和人类邪恶的敌人,通常被认为是堕落天使的领袖,不折不扣的恶魔,他有一个最好的把戏,是在不同人的面前可以显现不同的面目--变脸.令撒旦想不明白的是,耶稣怎么会有那么多跟随者呢? 有一天,耶稣带领众信徒上山传

Python爬虫|深入请求(四)常见的反爬机制以及应对方法

作者:David Qian 链接:https://zhuanlan.zhihu.com/p/21558661 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 大家好!我是厦门大学王亚南经济研究院的大一学生,今天将由我来为大家介绍一下常见的反爬机制以及应对方法. 注:非商业转载注明作者即可,商业转载请联系作者授权并支付稿费.本人已授权"维权骑士"网站(http://rightknights.com)对我在知乎发布文章的版权侵权行为进行追究与维权. ---

【玩转React】关于React你需要知道的事儿

前言 随着前端技术的迅猛发展,各种前端框架也随势崛起,但归根结底,支撑每一款web框架流行的强大因素都是它能更好地服务于业务. React 自然也不例外,它的开发者当初正在开发Facebook的一个广告系统,由于不满足于当下任何的 MVC 框架,所以就自己写了一套 UI 框架,于是乎大名鼎鼎的 React 就由此诞生了. React 的出现无疑为 web 开发带来了颠覆性的改变,多少开发者夜以继日只为体验一把 React 带来的快感.本文就将带领大家一起领略一番 React 的理念.特色与情怀.

数据挖掘|朴素贝叶斯算法

作者:张一 链接:https://zhuanlan.zhihu.com/p/21571692 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 因为后期的项目将涉及到各种各样的价格数据处理问题,所以我们现在开始学习一些简单的数据清洗与算法的知识.关于算法,以前听起来觉得好高大上,现在开始学,觉得书上的描述并不是很通俗易懂,所以用自己的语言来简要写一下这些算法~ 注:非商业转载注明作者即可,商业转载请联系作者授权并支付稿费.本人已授权"维权骑士"网站(ht

百度房间卡是否可骄傲是快乐积分拉斯科

http://www.ebay.com/cln/ycn6646/-/167568259015/2015.02.07 http://www.ebay.com/cln/gon-n31/-/167197496017/2015.02.07 http://www.ebay.com/cln/hu_d027/-/167453250013/2015.02.07 http://www.ebay.com/cln/ywa2962/-/167301832012/2015.02.07 http://www.ebay.co

笔试算法题(07):还原后序遍历数组 &amp; 半翻转英文句段

出题:输入一个整数数组,判断该数组是否符合一个二元查找树的后序遍历(给定整数数组,判定其是否满足某二元查找树的后序遍历): 分析:利用后序遍历对应到二元查找树的性质(序列最后一个元素必定是根节点,从左向右第一个比根节点大的元素开始直到根节点之前的所有元素必定在右子树,之前的所有元素必定在左子树): 解题: 1 bool PostOrderCheck(int *array, int i, int j) { 2 /** 3 * 如快速排序一样,解决小子文件 4 * */ 5 if(j-i+1 ==

java进阶07 线程的让步与阻塞与同步

前面介绍了线程的一些基本知识,现在来说下线程的让步,阻塞,和同步 先说说让步 所谓让步,就是让调用者的线程暂停,让其他线程重新竞争CPU,包括调用者. 先看看代码 package Thread; public class ThreadYield { public static void main(String[] args){ MyThread5 rthread=new MyThread5(); Thread thread1=new Thread(rthread); Thread thread2

P1807 最长路_NOI导刊2010提高(07)

P1807 最长路_NOI导刊2010提高(07) 题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入输出格式 输入格式: 输入文件longest.in的第一行有两个整数n和m,表示有n个顶点和m条边,接下来m行中每行输入3个整数a,b,v(表示从a点到b点有条边,边的长度为v). 输出格式: 输出文件longest.out,一个整数,即1到n之间的最长路径.如

Win32 汇编 - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

跳转指令分三类:一.无条件跳转: JMP;二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转);三.根据 EFLAGS 寄存器的标志位跳转, 这个太多了. 根据标志位跳转的指令: JE ;等于则跳转 JNE ;不等于则跳转 JZ ;为 0 则跳转 JNZ ;不为 0 则跳转 JS ;为负则跳转 JNS ;不为负则跳转 JC ;进位则跳转 JNC ;不进位则跳转 JO ;溢出则跳转 JNO ;不溢出则跳转 JA ;无符号大于则跳转 JNA

07:合影效果

07:合影效果 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念.如果他们站成一排,男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他们合影的效果是什么样的(所有人的身高都不同)? 输入 第一行是人数n(2 <= n <= 40,且至少有1个男生和1个女生).后面紧跟n行,每行输入一个人的性别(男male或女female)和身高(浮点数