使用两个栈实现堆

转载 2015年07月10日 17:56:02
扩展:用两个队列实现一个栈?
思路:
   1.有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。
   2.现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,
   这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。
   3.如果继续做push操作,比如插入d,f,则把d,f插入到q2中,
   4.此时若要做pop操作,则做步骤2
   5.以此类推,就实现了用两个队列来实现一个栈的目的。
   注意在此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的
   那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。
   对于pushpop操作,其时间为O(n).
#include <iostream>
#include <stack>
#include <assert.h>
using namespace std;
// 两个队列实现一个栈
template<typename T> class CStack
{
public:
    CStack() {}
    ~CStack() {}
    void mypush(const T& element);  
    void mypop();               
private:
    deque <T> m_queue1;
    deque <T> m_queue2;
};
template<typename T> void CStack<T>::mypop() //出栈 
{
    if (m_queue1.size() == 0)
    {
        while (m_queue2.size() > 1)
        {
            T& data = m_queue2.front();
            m_queue2.pop_front();
            m_queue1.push_back(data);
        }
        assert(m_queue2.size() == 1); //确保队列2内有一个元素
        T& result = m_queue2.front();
        m_queue2.pop_front();
        cout << result << endl;
    }
    else if (m_queue2.size() == 0)
    {
        while (m_queue1.size() > 1)
        {
            T& data = m_queue1.front();
            m_queue1.pop_front();
            m_queue2.push_back(data);
        }
        assert(m_queue1.size() == 1); //确保队列1内有一个元素
        T& result = m_queue1.front();
        m_queue1.pop_front();
        cout << result << endl;
    }
}
template<typename T> void CStack<T>::mypush(const T& element)//入栈 
{
    if (m_queue1.size() > 0)
    {
        m_queue1.push_back(element);
    }
    else if (m_queue2.size() > 0)
    {
        m_queue2.push_back(element);
    }
    else
    {
        m_queue1.push_back(element);
    }
}
int main()
{
    CStack<int> myStack;
    myStack.mypush(1);
    myStack.mypush(2);
    myStack.mypush(3);
    myStack.mypop();
    myStack.mypush(4);
    myStack.mypop();
    return 0;
}

使用两个栈实现队列问题
栈:后入先出,插入删除在栈顶操作
队列:先入先出,插入在队尾,删除在队首因此对队列进行的插入和删除操作都是在栈顶上
进行;我们总是把新元素插入到队列的尾部,而从队列的头部删除元素。
1)stack1 入队队列 的栈
2)stack2 出队队列 的栈,如果出队列时候,stack2为空则将stack1中元素全部
弹入stack2,然后出栈

template<typename T>  class CQueue
{
public:
      CQueue() {}
      ~CQueue() {}

      void appendTail(const T& node);  // append a element to tail
      void deleteHead();               // remove a element from head

private:
     T  m_stack1;
     T  m_stack2;
};
template<typename T> void CQueue<T>::appendTail(const T& element)//入队 
{
      m_stack1.push(element);
}
template<typename T> void CQueue<T>::deleteHead() //出队 
{
      if(m_stack2.size() <= 0)
      {
            while(m_stack1.size() > 0)
            {
                  T& data = m_stack1.top();
                  m_stack1.pop();
                  m_stack2.push(data);
            }
      }

      assert(m_stack2.size() > 0);
      m_stack2.pop();
}

相关文章推荐

文本相似性检测算法----simhash

hash函数      Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这...
  • Johline
  • Johline
  • 2017年03月01日 11:14
  • 528

【编程好习惯】使用空格增加可读性

本文出自 “至简李云” 博客,请务必保留此出处http://yunli.blog.51cto.com/831344/172242 对于下面的代码。 void push_ba...

~使用两个栈实现一个队列(优化版)~

~使用两个栈实现一个队列(优化版)~

使用两个栈实现一个队列

其实这个方法也可以使用与使用两个队列实现一个栈,利用一个队列作为缓冲的方法 zt原文已知下面Stack类及其3个方法Push、Pop和 Count,请用2个Stack实现Queue类的入队(...

~使用两个队列实现一个栈~

~使用两个队列实现一个栈~

剑指offer_面试题7_用两个栈实现队列(让我熟悉了类模板的使用)

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 template class ...

算法导论 使用两个队列实现一个栈

用两个队列实现一个栈1. 算法导论原题 10.1-7 Show how to implement a stack using two queues. Analyze the running ...

使用两个队列实现栈

使用两个队列来实现栈,C++实现,两个队列为轮流工作,每次出栈操作交换工作状态。...

使用两个队列实现一个栈

先普及小知识: STL 中栈的使用方法(stack)   基本操作: push(x) 将x加入栈中,即入栈操作 pop() 出栈操作(删除栈顶),只是出栈,没有返回值 top() 返回第...

~使用两个栈实现一个队列~

~使用两个栈实现一个队列~
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用两个栈实现堆
举报原因:
原因补充:

(最多只允许输入30个字)