剑指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个数字.求出这个圈圈里剩下的最后一个数字 ...
随机推荐
- .NET调用Java写的WebService
最近遇到一个用.net调用java写的webservice的应用,对方程序员提供了一个后缀为wsdl的文件,这个跟.Net里面生成的wsdl文件差不多,起初没什么概念就查了点资料,知道可以将这个wsd ...
- 关于C# webform 项目发布 aspx页面无任何代码 每个页面都以dll形式发布
关于C# webform 项目发布 注意:aspx页面无任何代码,每个页面都以dll形式发布带bin文件夹里 具体操作方法如下图:
- JavaScript 弹窗
JavaScript 弹窗 可以在 JavaScript 中创建三种消息框:警告框.确认框.提示框. 警告框 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行 ...
- C++模板实例化(1)
On-Demand实例化 当C++编译器遇到模板特化的时候,他会利用所给的实参替换对应的模板参数,从而产生该模板的特化.该过程是自动进行的.有时候也会被称为隐式实例化,或者是自动实例化. on-dem ...
- Google面试题:计算从1到n的正数中1出现的次数
题目: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 找工作,准备看写题目,题目说是Goo ...
- CentOS6.5升级手动安装gcc4.8.2
一.简易安装 操作环境 CentOS6.5 64bit,原版本4.4.7,不能支持C++11的特性~,希望升级到4.8.2 不能通过yum的方法升级,需要自己手动下载安装包并编译 1.1 获取安装包并 ...
- UINavigationController 与 UITabBarController
http://www.cnblogs.com/YouXianMing/p/3756904.html // index start from 1. UITabBarItem *newsItem = [[ ...
- centos 普通用户添加sudo权限
本文介绍下,在centos中为普通用户添加sudo权限的方法,供大家学习参考. 在centos中为普通用户增加sudo权限的简单方法,大家参考下. 1,修改/etc/sudoers文件,必须为visu ...
- 跟着PHP100第一季学写一个CMS(11-20)
PS.刚发现IE并不兼容,有点悲剧 cms1.1密码处理 1.小知识:sha1($_answer) //加密为40位,不知道能不能破解 2.小知识:mysql_real_escape_string( ...
- CentOS安装thrift
下载thrift依赖的东西 yum -y install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-dev ...