题目描述:

用两个栈来实现一个队列,完成队列的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
样例输出:
10
-1

题解:应该是考察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》面试题-用两个栈实现队列的更多相关文章

  1. 《剑指Offer》-005 -用两个栈实现队列

    如题 (总结要点) 用两个栈实现队列 栈; 先进后出 队列: 先进先出 两个栈, 相等于两个杯子; 把一本水倒来倒去, 取到杯子底部的元素,并且删除,再倒回去 原文链接 : 借鉴学习文章列表 链接1: ...

  2. 剑指offer:JZ9 用两个栈实现队列

    JZ9 用两个栈实现队列 描述 用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能. 队列中的元素为int类型.保证操作合法,即保 ...

  3. 剑指offer 05:用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题代码 import java.util.Stack; public class Solution{ ...

  4. 剑指offer五之用两个栈实现队列

    一.题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 二.思路 1.Push操作:将数据直接压入stack1即可 2.Pop操作:将stack1中的数据全部弹 ...

  5. 【剑指 Offer】09.用两个栈实现队列

    题目描述 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead , 分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,del ...

  6. 【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 一个栈用来保存输入,一个栈用来输出 日 ...

  7. 剑指Offer系列_09_用两个栈实现队列

    package leetcode.sword_to_offfer.day01; import java.util.LinkedList; /** * 用两个栈实现一个队列.队列的声明如下,请实现它的两 ...

  8. 剑指offer 面试题52. 两个链表的第一个公共节点

    这题之前leetcode做过,权当复习 首先这题没说是否一定有公共节点,如果代码可能因为这一点造成死循环的,需要提前验证所给两个链表是否有公共节点. 方法1:对于每一个list1的节点,遍历list2 ...

  9. 剑指offer(五):用两个栈实现一个队列

    题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...

  10. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

随机推荐

  1. WinForm LED循环显示信息,使用定时器Threading.Timer

    原文:WinForm LED循环显示信息,使用定时器Threading.Timer 这里用一个示例来演示timer如何使用.示例:LED屏幕显示描述:这个示例其实很简单,LED屏幕上显示3个信息:  ...

  2. 用grunt搭建自动化的web前端开发环境

    用grunt搭建自动化的web前端开发环境 jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发 ...

  3. js 正则学习小记之左最长规则

    原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'nfa'.其实我们的本意是想得到整 ...

  4. uva 12003 Array Transformer (大规模阵列)

    白皮书393页面. 乱搞了原始数组中.其实用另一种阵列块记录. 你不能改变原始数组. 请注意,与原来的阵列和阵列块的良好关系,稍微细心处理边境.这是不难. #include <cstdio> ...

  5. 从头开始学JavaScript (八)——变量

    原文:从头开始学JavaScript (八)--变量 一.变量分类: 基本类型值:null.undefined.number.string.Boolean: 引用类型值:保存在内存中的对象,如:Obj ...

  6. iOS 开发小技巧

    1.Xcode配置 1.1> 安装Alcatraz包管理器 打开Terminal终端命令行 curl -fsSL https://raw.github.com/supermarin/Alcatr ...

  7. C语言qsort函数算法性能测试

    对于该算法的复杂性.一个直接的方法是测量的一定量的算法级数据的执行时间的感知. 随着C语言提供qsort对于示例.随着100一万次的数据,以测试其计算量.感知O(nlg(n))时间成本: C码如下面: ...

  8. JavaWeb显示器

    本文研究的总结.欢迎转载,但请注明出处:http://blog.csdn.net/pistolove/article/details/44310967 A:监听器的定义      专门用于其它对象身上 ...

  9. 优秀的前端project如何制定一个老师--html学习路径

    一个好的前端project教师发展,不是一蹴而就,它需要大量的学习和积累. 至于谁刚开始学习的人,如何入门.学习如何选择我的路线,做了各种工具? 1.  学习之前 1.不要着急看一些复杂网页效果的代码 ...

  10. 让Docker功能更强大的10个开源工具

    让Docker功能更强大的10个开源工具 更好的管理.Web前端程序.更深入地了解容器应用程序,Docker生态系统正在迅速发展,这还得归功于其充满活力的开源社区. 软件项目的成功常常根据其催生的生态 ...