使用两个栈实现堆

转载 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();
}

用两个队列模拟一个栈

用两种方法实现了用两个队列模拟一个栈的操作。一种的入栈时间复杂度为O(1),出栈O(n),一种入栈O(n),出栈O(1)。 并且附有源代码方便今后阅读和与大家交流。...
  • yin1203014
  • yin1203014
  • 2015年07月25日 23:23
  • 1464

C++两个栈实现一个队列和两个队列实现一个栈

今天用C++实现了下两个栈模拟一个队列和两个队列模拟一个栈!代码可能有很多漏洞,如果读者发现问题, 可以及时反馈,非常感谢!!!         代码如下: #include #include...
  • qianghaohao
  • qianghaohao
  • 2016年05月04日 22:11
  • 842

堆栈几种实现方法

基本的抽象数据类型(ADT)是编写C程序必要的过程,这类ADT有链表、堆栈、队列和树等,本文主要讲解下堆栈的几种实现方法以及他们的优缺点。   堆栈(stack)的显著特点是后进先出(Last-...
  • DEV_linux
  • DEV_linux
  • 2014年07月12日 23:25
  • 788

C# 深入理解堆栈、堆在内存中的实现

尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,以优化我们的应用程序。同时,还需要具备一些基础的内存管理工作机制...
  • taoerit
  • taoerit
  • 2016年12月01日 14:12
  • 5867

两个栈S1和S2来模拟一个队列

#include "StructSize.h" //#include /* 请利用两个栈S1和S2来模拟一个队列。 已知栈的四个运算定义如下: Init(ST): 初始化ST栈,初始化完成...
  • fan9511
  • fan9511
  • 2014年07月21日 14:14
  • 2187

【经典面试题】两个栈模拟一个队列

题目:用两个栈模拟一个队列思路讲解
  • u011812294
  • u011812294
  • 2015年10月14日 20:22
  • 1315

JAVA堆栈图解

转自:http://www.iteye.com/topic/634530 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但...
  • LK274857347
  • LK274857347
  • 2017年08月23日 22:07
  • 1117

堆和栈的区别详细说明

  • 2010年04月16日 17:35
  • 8KB
  • 下载

两个队实现栈

我们知道队的特点是先进先出,元素只能从队的尾部进入,只能从队的尾部出来;栈的特点是先进先出,先进栈的元素被压入栈底,后进入的元素覆在栈顶,出栈时也只能从栈的顶部出来。所以我们要借用两个队来实现栈的功能...
  • qingqiulengya
  • qingqiulengya
  • 2016年05月30日 10:46
  • 430

【C++面试题】利用两个栈实现1个队列

1、题目   利用两个栈实现一个队列    2、要求   只能使用栈的pop(),top()和push(),以及测试栈是否为空empty()四个操作. 来实现队列的empty(), ...
  • liulongling
  • liulongling
  • 2016年02月19日 11:03
  • 1872
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用两个栈实现堆
举报原因:
原因补充:

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