《剑指Offer》面试题-用两个栈实现队列
- 题目描述:
-
用两个栈来实现一个队列,完成队列的Push和Pop操作。
队列中的元素为int类型。
- 输入:
-
每个输入文件包含一个测试样例。
对于每个测试样例,第一行输入一个n(1<=n<=100000),代表队列操作的个数。
接下来的n行,每行输入一个队列操作:
1. PUSH X 向队列中push一个整数x(x>=0)
2. POP 从队列中pop一个数。
- 输出:
-
对应每个测试案例,打印所有pop操作中从队列pop中的数字。如果执行pop操作时,队列为空,则打印-1。
- 样例输入:
-
- 3
- PUSH 10
- POP
- POP
- 3
- 样例输出:
-
- 10
- -1
- 10
题解:应该是考察STL栈应用的一道面试题,还有一点小技巧,不要用两个水杯倒来倒去(如图,明显错误做法)。用一个水杯倒就可以了。
代码:C的简洁 && C++的优雅。
C代码:
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- int main(int argc, char const *argv[])
- {
- int t, data, top1, top2;
- top1 = top2 = 0;
- scanf("%d", &t);
- char command[10];
- int *stack1 = (int *)malloc( (t+1) * sizeof(int));
- int *stack2 = (int *)malloc( (t+1) * sizeof(int));
- while(t--){
- scanf("%s", command);
- if(strcmp(command, "PUSH") == 0){
- scanf("%d", &data);
- stack1[top1++] = data;
- }
- if(strcmp(command, "POP") == 0){
- if(!top1 && !top2) printf("-1\n");
- else{
- if(!top2)
- while(top1)
- stack2[top2++] = stack1[--top1];
- printf("%d\n", stack2[--top2]);
- }
- }
- }
- return 0;
- }
C++ 代码:
- #include <cstdio>
- #include <stack>
- using namespace std;
- char ch[10];
- class queue
- {
- public:
- void push(int a)
- {
- pushStack.push(a);
- }
- int pop()
- {
- int tmp = -1;
- if (popStack.empty())
- {
- if (pushStack.empty())
- return -1;
- else
- {
- while (!pushStack.empty())
- {
- popStack.push(pushStack.top());
- pushStack.pop();
- }
- }
- }
- tmp = popStack.top();
- popStack.pop();
- return tmp;
- }
- private:
- stack<int> pushStack;
- stack<int> popStack;
- };
- int main()
- {
- int n,t;
- while(scanf("%d",&n) != EOF)
- {
- queue q;
- for(int i = 0; i < n; ++i)
- {
- scanf("%s",ch);
- if(ch[1] == 'U')
- {
- scanf("%d",&t);
- q.push(t);
- }else
- {
- printf("%d\n",q.pop());
- }
- }
- }
- return 0;
- }
C++的 优雅写法:
- #include<iostream>
- #include<stdlib.h>
- #include<stack>
- using namespace std;
- template <typename T>class CQueue
- {
- public:
- CQueue(void);
- ~CQueue(void);
- void appendtail(const T& node);
- T deleteHead();
- private:
- stack<T> stack1;
- stack<T> stack2;
- };
- //构造函数
- template <typename T> CQueue<T>::CQueue(void)
- {
- }
- //析构函数
- template <typename T> CQueue<T>::~CQueue(void)
- {
- }
- //插入元素
- template <typename T> void CQueue<T>::appendtail(const T& node)
- {
- stack1.push(node);
- }
- //删除元素并返回
- template <typename T> T CQueue<T>::deleteHead()
- {
- if(stack2.size()<=0)
- {
- while(stack1.size()>0)
- {
- stack2.push(stack1.top());
- stack1.pop();
- }
- }
- if(stack2.size()==0)
- throw new exception("队列为空");
- T head=stack2.top();
- stack2.pop();
- return head;
- }
- void main()
- {
- CQueue<int> queue;
- queue.appendtail(1);
- queue.appendtail(2);
- queue.appendtail(3);
- queue.appendtail(4);
- int len=4;
- while(len>0)
- {
- cout<<queue.deleteHead()<<endl;
- --len;
- }
- }
《剑指Offer》面试题-用两个栈实现队列的更多相关文章
- 《剑指Offer》-005 -用两个栈实现队列
如题 (总结要点) 用两个栈实现队列 栈; 先进后出 队列: 先进先出 两个栈, 相等于两个杯子; 把一本水倒来倒去, 取到杯子底部的元素,并且删除,再倒回去 原文链接 : 借鉴学习文章列表 链接1: ...
- 剑指offer:JZ9 用两个栈实现队列
JZ9 用两个栈实现队列 描述 用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能. 队列中的元素为int类型.保证操作合法,即保 ...
- 剑指offer 05:用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题代码 import java.util.Stack; public class Solution{ ...
- 剑指offer五之用两个栈实现队列
一.题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 二.思路 1.Push操作:将数据直接压入stack1即可 2.Pop操作:将stack1中的数据全部弹 ...
- 【剑指 Offer】09.用两个栈实现队列
题目描述 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead , 分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,del ...
- 【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 一个栈用来保存输入,一个栈用来输出 日 ...
- 剑指Offer系列_09_用两个栈实现队列
package leetcode.sword_to_offfer.day01; import java.util.LinkedList; /** * 用两个栈实现一个队列.队列的声明如下,请实现它的两 ...
- 剑指offer 面试题52. 两个链表的第一个公共节点
这题之前leetcode做过,权当复习 首先这题没说是否一定有公共节点,如果代码可能因为这一点造成死循环的,需要提前验证所给两个链表是否有公共节点. 方法1:对于每一个list1的节点,遍历list2 ...
- 剑指offer(五):用两个栈实现一个队列
题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
随机推荐
- XP下类似%windir% %userprofile% 的变量的说明(转)
在一些批处理或者系统技巧操作教程文章中,我们常常会看到一些形如 %windir% 或者 %systemdrive% 的变量.这些变量都代表着什么含义呢?下面小技巧之家为大家整理了在Windows XP ...
- CQRS
CQRS 2015-06-04 15:33 by 敏捷的水, 177 阅读, 0 评论, 收藏, 编辑 CQRS是Command Query Responsibility Seperation(命令查 ...
- HTTPS那个东西(一)-HTTPS原理
HTTPS那个东西(一) 最近看了<http权威指南>几个章节,对HTTPS随着节,了一些资料,遂打算记录一下心得.写的仓促,肯定有非常多错误的地方,欢迎大家指正. 1.HTTP是什么 那 ...
- 3.集--LinkedTransferQueue得知
近期在阅读开源项目里,发现有几个project都不尽同样地使用LinkedTransferQueue这个数据结构.比方netty,grizzly,xmemcache,Bonecp. Bonecp还扩展 ...
- java:高速排序算法与冒泡排序算法
Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /** * * @Description: * @author:cuiyaon ...
- 类别sort使用排序
2129: 船上的第二次测试第三个问题 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 243 Solved: 74 [Submit][id=2129 ...
- 【百度地图API】如何制作多途经点的线路导航——驾车篇
原文:[百度地图API]如何制作多途经点的线路导航--驾车篇 摘要: 休假结束,酸奶小妹要从重庆驾车去北京.可是途中要去西安奶奶家拿牛奶饼干呢!用百度地图API,能不能帮我实现这个愿望呢? ----- ...
- 在ASP.NET应用中执行后台任务
在ASP.NET应用中执行后台任务 昨天下午,在微软的MVP 2015社区大讲堂上给大家分享了一个题目:在ASP.NET应用中执行后台任务.这是一点都不高大上,并且还有点土气的技术分享.不过我相信很多 ...
- Delphi三层网络架构代码实现
Delphi三层网络架构代码实现 1 .三层网络的概念 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为: 表现层(UI).业务逻辑层(BLL).数据访 ...
- struts2文件下载 <result type="stream">
<!--struts.xml配置--> <action name="download" class="com.unmi.action.DownloadA ...