剑指offer--面试题7
//两个栈实现一个队列 #include<stack> //STL
#include<iostream> using namespace std; template<class T>
class CQueue
{
public:
CQueue();
~CQueue(); void appendTail(const T& node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
}; //思路:一个栈做添加队尾元素用;另一个做删除队首元素用。
// 操作时,对应栈有数据,另一个为空。 template<class T>
CQueue<T>::CQueue()
{
} template<class T>
CQueue<T>::~CQueue()
{
}
//stack1作为添加队尾元素的栈
template<class T>
void CQueue<T>::appendTail(const T& node)
{
if(stack1.empty())
{
while(!stack2.empty())
{
T temp = stack2.top();
stack1.push(temp);
stack2.pop();
}
stack1.push(node);
}
else
stack1.push(node);
} //stack2作为删除队首元素的栈
template<class T>
T CQueue<T>::deleteHead()
{
T Head;
if(stack2.empty())
{
if(stack1.empty())
{
cerr<<"This Queue is already empty!"
<<"Have no to be deleted!"<<endl;
exit();
}
while(!stack1.empty())
{
T temp = stack1.top();
stack2.push(temp);
stack1.pop();
}
Head = stack2.top();
stack2.pop();
}
else
{
Head = stack2.top();
stack2.pop();
} return Head;
} int main(int argc, char* argv[])
{
CQueue<char> q1;
q1.appendTail('a');
q1.appendTail('b');
q1.appendTail('c');
q1.appendTail('d');
q1.appendTail('e'); char Head = q1.deleteHead();
cout<<Head<<endl;
Head = q1.deleteHead();
cout<<Head<<endl; q1.appendTail('f');
q1.appendTail('g');
Head = q1.deleteHead();
cout<<Head<<endl;
Head = q1.deleteHead();
cout<<Head<<endl;
Head = q1.deleteHead();
cout<<Head<<endl;
Head = q1.deleteHead();
cout<<Head<<endl;
return ;
}
自己所做如上所示。思路就是:一个做删除栈;一个做添加栈。
相比较于作者的思想,虽然大体一致,但自己的思想有多余的部分:
在添加元素的时候,无论stack1是否为空,作者采取的策略为直接入栈,而自己却是先将stack2中的元素再弹出压入stack1,这一步根本就是多余的!
作者代码如下:(自己默写)
//作者代码,更简洁!
//stack1做入队操作,直接入队
template<typename T>
void CQueue<T>::appendTail(const T& node)
{
stack1.push(node);
} //stack2做出队操作
template<typename T>
T CQueue<T>::deleteHead()
{
if(stack2.empty())
{
while(stack1.empty())
{
T head = stack1.top();
stack2.push(head);
stack1.pop();
}
} if(stack2.empty())
throw new exception("queue is empty."); T Head = stack2.top();
stack2.pop(); return Head;
}
作者代码的结构安排更紧凑,更简洁!!!
剑指offer--面试题7的更多相关文章
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
随机推荐
- 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
[导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...
- PHP使用COM 获取RTF内容
1. 需要在APP服务器上安装Office 2. 可能需要创建文件夹:Desktop C:\Windows\SysWOW64\config\systemprofile\Desktop 3. 可能需要设 ...
- iOS定位 (一) 地图定位
带地图的定位方法#import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h> <MKMapViewDel ...
- iOS-Andriod百度地图仿百度外卖-饿了么-选择我的地址-POI检索/
http://zanderzhang.gitcafe.io/2015/09/19/iOS-Andriod百度地图仿百度外卖-饿了么-选择我的地址-POI检索/ 百度外卖选择送货地址: 饿了么选择送货地 ...
- 分享10 个超酷的 HTML5/CSS3 应用及源码
1.HTML5视频破碎重组特效,强大视觉冲击 HTML5视频播放器很多,但是HTML5视频特效还是很少见的,这款HTML5视频破碎重组特效非常刺激,给人强大的视觉冲击.点击视频任意地方,HTML5将会 ...
- Codevs 1063 合并果子
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分 ...
- HDU 5093 Battle ships(二分图最大匹配)
题意:一个m行n列的图由#.*.o三种符号组成,分别代表冰山.海域.浮冰,问最多可放的炮舰数(要求满足以下条件) 1.炮舰只可放在海域处 2.两个炮舰不能放在同一行或同一列(除非中间隔着一个或多个冰山 ...
- 10+ powerful debugging tricks with Visual Studio
10+ powerful debugging tricks with Visual Studio Original link : http://www.codeproject.com/Articles ...
- Perl的主要应用领域
1.Unix系统的维护功能 如我们在前面所说的,Perl可以作为传统Unix系统维护工具的替代,在这方面,它可以对文本文件,特别是对配置文件(还记不记得在配置Linux系统中的文本方式的配置)进 ...
- 支持IE6的树形节结构TreeTable实际应用案例
<script src="jquery.js" type="text/javascript"></script> <script ...