【算法题目】用两个栈实现一个队列

相关题目:《剑指offer》面试题7

template<T>
class Queue {
 public:
     Queue();
     ~Queue();

     void Push(const T& value) {
         s1.push(value):
     }

     void Pop() {
         if (s2.empty()) {
             while (!s1.empty()) {
                 s2.push(s1.top());
                 s1.pop();
             }
         }

         s2.pop();
     }

 private:
     stack<T> s1;
     stack<T> s2;
}

用两个队列实现一个栈:

template<typename T>
clsss Stack {
 public:
     Stack();
     ~Stack();

     void Push(const T& value) {
         q1.push(value);
     }

     void Pop() {
         if (s2.empty()) {
             while (!s1.empty()) {
                 s2.push(s1.front());
                 s1.pop();
             }
         }

         return s2.top();
     }

     T& Top() {
         return s2.front();
     }

 private:
     queue<T> q1;
     queue<T> q2;
}
时间: 2024-11-05 11:50:46

【算法题目】用两个栈实现一个队列的相关文章

C++算法之 用两个栈实现一个队列

算法思路: 一个栈用来入队列,一个栈用来出队列: 现有两个栈s1 和s2:s1用来入栈,比如  队列进入  1 2 3 4 5 那么s1进栈 1 2 3 4 5 ,现在要出队列,意思就是要1先出来: 那么我们把栈s1的数据取出来都压到栈s2当中,那么栈s2就是 5 4 3 2 1 :s2再出栈,此时1出栈就模拟出出队列的效果: 编写代码: // QueueFrom2Stack.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include &l

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

题目描述:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 1 template <typename T> class CQueue 2 { 3 public: 4 CQueue(void); 5 ~CQueue(void); 6 7 void appendTail(const T& node); 8 T deleteHead(); 9 10 private: 11 stack&l

每天一个小算法(6)---- 通过两个栈实现一个队列

这个算法也很简单,定义两个栈m_aStack.m_bStack,m_aStack负责push()数据,m_bStack负责front()数据. 思路:每一次front()取数据都会检查一下m_bStack是否为空,为空则把m_aStack的所有数据pop()出来push()到m_bStack中. 因为STL里有stack,直接拿来用了,代码使用C++,在linux/g++下编译运行成功: 1 #include <stack> 2 #include <stdio.h> 3 #incl

数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈

今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列.可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归.那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题. 一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出. public class Queen(Stack s1,Stack s2){ //实现插入的方法 public void ad

两个栈实现一个队列和两个队列实现一个栈【算法导论课后题】

关于两个栈实现一个队列和两个队列实现一个栈问题,网上有很多资料.这里只描述自己认为操作最少的方法. 两个栈实现一个队列 思想:假设两个栈分别为s1,s2.对s1进行入队,出队时,先判断s2是否为空,如果是则将s1中元素压入s2并弹出最上面元素,如果不是,则直接弹出s2最上面的元素. <span style="font-size:18px;">EnQueue(s1,s2,k){ push(s1,k)</span><span style="font-

[算法学习]两个栈实现一个队列

问题描述: 用两个栈实现一个队列,实现两个方法:入队appendTail,出队deleteHead 分析: 第一眼就能想到两个做法, (1) 入队麻烦出队容易: 声明两个栈,一个是存数据用的栈(dataStack),一个是辅助用的栈(tempStack). 入队操作时,先将dataStack中的所有元素出栈压入tempStack中,然后将要入队的元素压入tempStack中,再将tempStack所有元素出栈到dataStack,至此入队成功,dataStack栈顶元素就是第一个入队的元素(队头

两个栈实现一个队列

问题描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解法分析: 首先题目要求用两个栈实现一个队列,那么就要先分析为什么这么做.队列的特点就像排队的"先到先得"一样,即先入队的就先出队:而栈则正好相反,特点是"后进先出",那么问题来了怎么用"后进先出"的得到"先进先出"? 传说中最简单通用但效率不高的方法(其实我还真没想到这么做)是,入队的时候用stack1来存储,当出队的时候,先把

用两个栈实现一个队列,并实现在多线程环境下

在知乎上看到这道题目,就实现了下看看.如有错误,麻烦各位看官留言指导下. 首先两个栈实现一个队列的思路是这样的: (1)用栈A作为队列的入口,只提供入队操作, 用栈B作为队列的出口,只提供出口. (2)由于栈的特性是后进先出, 队列是先进先出, 若要出队(即把栈A最底层的元素pop出来), 需要把栈A整个转移到栈B(转移后就变为了倒序),此时只要pop栈B就能成功出队一个元素 (3)同理若要入队, 则要先把栈B整个转移到栈A,再push一个元素到栈A  ( 具体的操作只要简单画个图就能明白 )

剑指offer:用两个栈实现一个队列

题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 类似汉诺塔,当我们需要将栈A下面的元素出栈的时候可以先将栈A中的元素全部逆序压入到另一个栈B,这时栈B保存的就是栈A的逆序,也就是满足了FIFO的要求 class Solution: """ 用两个栈模拟一个队列,如果两个栈的容量分别为M和N,其中M > N,那么模拟得到的队列的容量是2N+1 因为假设先把stack2塞满N个,然后此时stack1塞进N+2个,那么此时将元素出

使用两个栈实现一个队列

使用两个栈Stack1和Stack2来实现一个队列.其中一个栈作为主存放数据的,另外一个栈作为临时存放数据的栈.具体操作如下: enqueue: 栈Stack1的入栈操作. dequeue:将Stack1中的元素一个一个地全部依次出栈,并且在Stack1出栈的同时把出栈的元素作为参数对Stack2进行入栈操作.这步完成之后,执行Stack2出栈操作,这时就将原先在Stack1中最先入栈的元素弹出.最后再将Stack2中的元素一个一个地全部依次出栈,填到Stack1中. 实现代码如下: /** *