剑指offer (7) 两个栈实现队列 两个队列实现栈

题目:用两个栈实现一个队列.

队列的声明如下,请实现它的两个函数 appendTail 和  deleteHead,分别完成队列尾部插入结点 和 队列头部删除结点

AppendTail:直接将元素入栈stack1

DeleteHead:当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出

如果stack2为空,我们把stack1中的元素逐个弹出并入栈stack2,由于先进入队列的元素被压到stack1的底端,经过弹栈和压入stack2之后就处于stack2的顶端


 1 #include <stack>
2 #include <stdexcept>
3
4 template <typename T>
5 class MyQueue {
6 public:
7 MyQueue();
8 ~MyQueue();
9
10 void AppendTail(const T& node);
11 T DeleteHead();
12
13 private:
14 std::stack<T> stack1;
15 std::stack<T> stack2;
16 };
17
18 template<typename T>
19 void MyQueue<T>::AppendTail(const T& node)
20 {
21 stack1.push(node);
22 }
23
24 template<typename T>
25 T MyQueue<T>::DeleteHead()
26 {
27 if (stack2.size() <= 0) {
28 while (stack1.size() > 0) {
29 T& data = stack1.top();
30 stack1.pop();
31 stack2.push(data);
32 }
33 }
34 if (stack2.empty) {
35 throw runtime_error("queue is empty");
36 }
37
38 T head = stack2.top();
39 stack2.pop();
40 return head;
41 }

题目:用两个队列实现一个栈.

栈的声明如下,请实现它的两个函数 Push 和  Pop,分别完成入栈 和 出栈 功能

入栈:仅将元素push到 非空队列

出栈:将非空队列的元素逐个出队列,并且将 除了最后一个元素的其余所有元素 push到 另外的空队列


 1 #include <stack>
2 #include <stdexcept>
3
4 template <typename T>
5 class MyStack {
6 public:
7 MyStack();
8 ~MyStack();
9
10 void Push(const T& data);
11 void Pop();
12 private:
13 std::queue<T> queue1;
14 std::queue<T> queue2;
15 };
16
17 template <typename T>
18 void MyStack<T>::Push(const T& data)
19 {
20 if (queue1.empty() && queue2.empty()) queue1.push(data);
21 if (queue1.empty() && !queue2.empty()) queue2.push(data);
22 if (!queue1.empty() && queue2.empty()) queue1.push(data);
23 if (!queue1.empty() && !queue2.empty()) throw runtime_error("tow queues cannot non-empty at same time");
24 }
25 template <typename T>
26 void MyStack<T>::Pop()
27 {
28 if (queue1.empty() && queue2.empty()) {
29 throw runtime_error("two queues are empty");
30 }
31
32 if (!queue1.empty() && !queue2.empty()) {
33 throw runtime_error("two queues cannot non-empty at same time");
34 }
35
36 if (!queue1.empty() && queue2.empty()) {
37 int nNodes = queue1.size();
38 int i = 0;
39 while (!queue1.empty()) {
40 T& node = queue1.front();
41 queue1.pop();
42 if (i < nNodes - 1) {
43 queue2.push(node);
44 ++i;
45 }
46 }
47 }
48
49 if (queue1.empty() && !queue2.empty()) {
50 int nNodes = queue2.size();
51 int i = 0;
52 while (!queue2.empty()) {
53 T& node = queue2.front();
54 queue2.pop();
55 if (i < nNodes - 1) {
56 queue1.push(node);
57 ++i;
58 }
59 }
60 }
61 }

时间: 2024-10-11 07:53:06

剑指offer (7) 两个栈实现队列 两个队列实现栈的相关文章

《剑指offer》— JavaScript(5)用两个栈实现队列

用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 实现代码 function Stack(){ var items=[]; this.push=function(item){ items.push(item); } this.pop=function(){ return items.pop(); } this.isEmpty=function(){ return items.length==0; } } var stack1= ne

【剑指offer学习】求和为定值的两个数

<神雕侠侣>中的'剑冢',收存着'剑魔独孤求败'生平用过的三把剑:"杨过提起右首第一柄剑,只见剑下的石上刻有两行小字'凌厉刚猛,无坚不摧,弱冠前以之与河朔群雄争锋':第二把是玄铁重剑:'重剑无锋,大巧不工.四十岁前恃之横行天下':第三把则是木剑,剑下的石刻道:'四十岁后,不滞于物,草木竹石均可为剑.自此精修,渐进于无剑胜有剑之境.'.算法的精髓也在于此,只有突破一层层境界,才能有所突破. 题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有

剑指offer 36.时间空间效率的平衡 两个链表的第一个公共结点

题目描述 输入两个链表,找出它们的第一个公共结点. 解题思路 如果存在共同节点的话,那么从该节点,两个链表之后的元素都是相同的. 也就是说两个链表从尾部往前到某个点,节点都是一样的. 我们可以用两个栈分别来装这两条链表.一个一个比较出来的值. 找到第一个相同的节点. 代码如下 public class FindFirstCommonNode { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { if (

【剑指offer学习】求和为定值的两个数(拓展)

接着上面一篇文章: http://blog.csdn.net/u013476464/article/details/40651451 接下来我们拓展一下题目,如果数组是乱序的,并且规定数组中的元素所有为非负整数,相同给定一个数sum,在数组中找出随意两个数,使二者的和为sum. 分析: 由于题目中限定了数组中的元素为非负整数,因此我们能够用哈希数组,开辟一个长度为sum的bool数组B[sum],并所有初始化为false,对数组A进行一次遍历,假设当前的元素A[i]大于sum,则直接跳过,否则,

【剑指offer】面试题17、合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的.例如输入图中的链表 1 和链表 2,则合并之后的升序链表如链表 3 所示.链表结点定义如下: typedef struct Node { int m_nValue; struct Node *m_pNext; }ListNode; 一.创建有序链表 创建有序链表的一般步骤: 1.初始化链表为空: 2.生成新的结点指针 pNew: 3.找到该结点值对应的位置,有两种可能:头部,非头部: 4.插入该结点. 假设一链表

《剑指offer》第五十九题II:队列的最大值

// 面试题59(二):队列的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小3,那么一共存在6个 // 滑动窗口,它们的最大值分别为{4, 4, 6, 6, 6, 5}, #include <cstdio> #include <deque> #include <exception> using namespace std; template<

剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()-1份元素poll出来,添加到另为一个为空的队列中,再把队列中最后的元素poll出来两个队列在栈不为空的情况下始终是有一个为空,另一个不为空的.push添加元素到非空的队列中,pop把非空队列的元素转移到另一个空的队列中,直到剩下最后一个元素,这个元素就是要出栈的元素(最后添加到队列中的元素). 1

剑指OFFER之用两个栈实现队列(九度OJ1512)

题目描述: 用两个栈来实现一个队列,完成队列的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

《剑指Offer》附加题_用两个队列实现一个栈_C++版

在<剑指Offer>中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即"用两个队列实现一个栈". 在计算机数据结构中,栈的特点是后进先出,即最后被压入(push)栈的元素会第一个被弹出(pop);队列的特点是先进先出,即第一个进入队列的元素将会被第一个弹出来.虽然栈和队列特点是针锋相对,但是两者却相互联系,可以互相转换. 在"用两个队列实现一个栈"问题中,我们用两个队列的压入和弹出来模拟栈的压入和弹出.我们通过画图的手段把抽象的问题形象化. 在上

[剑指Offer]9.用两个栈实现队列

题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 用栈来模拟队列.我们首先插入一个元素a到stack1中,再压入两个元素bc,此时栈中有元素abc,其中c位于栈顶,而stack2仍然为空.我们试着删除一个元素.按照队列先进先出的原则,我们应该先删除元素a.元素a存放在stack1中且不在栈顶,因此不能直接删除.注意到stack2还未使用,我们把stack1中的元素逐个弹出并压入stack2中,stack2中的元素是cba,栈顶元素是a,我们现在可以