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

////////////////////////////////////////////////////////////////////////////////////

// 10.题目七:用两个栈实现队列

// 题目:用两个栈实现一个队列,队列的声明如下:

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

    void AppendTail(const TYPE& node);

    TYPE DeleteHead();

private:
    stack<TYPE> m_stPushStack;
    stack<TYPE> m_stPopStack;

};

// 方法一:
//    插入时 --> m_stPopStack不为空,将元素压入m_stPushStack;
//    删除时 --> m_stPushStack不为空,将元素压入 m_stPopStack;

// 方法二:
//    插入时 --> 直接往 m_stPushStack 插入新元素
//    删除时 --> 如果m_stPopStack为空,插入m_stPushStack中元素,否则直接弹出元素
template <typename TYPE>
TYPE CQueue<TYPE>::DeleteHead()
{
#if 0
    while (!m_stPushStack.empty())
    {
        m_stPopStack.push(m_stPushStack.top());
        m_stPushStack.pop();
    }

#else
    if (m_stPopStack.empty())
    {
        while (!m_stPushStack.empty())
        {
            m_stPopStack.push(m_stPushStack.top());
            m_stPushStack.pop();
        }
    }

#endif

    TYPE tmp = m_stPopStack.top();
    m_stPopStack.pop();

    return tmp;
}

template <typename TYPE>
void CQueue<TYPE>::AppendTail(const TYPE& node)
{
#if 0
    while (!m_stPopStack.empty())
    {
        m_stPushStack.push(m_stPopStack.top());
        m_stPopStack.pop();
    }

    m_stPushStack.push(node);
#else

    m_stPushStack.push(node);

#endif
}

void QueueWithTwoStackTestFunc()
{
    cout << "\n\n --------------- QueueWithTwoStackTestFunc Start -------------->" << endl;
    CQueue<int> stQueue;
    stQueue.AppendTail(1);
    stQueue.AppendTail(2);
    stQueue.AppendTail(3);
    cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl;

    stQueue.AppendTail(4);
    stQueue.AppendTail(5);
    stQueue.AppendTail(6);
    cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl;
    cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl;
    cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl;
    cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl;
    cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl;

    cout << "\n\n --------------- QueueWithTwoStackTestFunc End -------------->" << endl;

}

/////////////////////////////////////////////////////////////////////////////////////////////

// 11.用两个队列实现一个栈

template <typename TYPE>
class CStack
{
public:
    CStack(){}
    ~CStack(){}

public:
    void AppendTail(const TYPE& value);

    TYPE DeleteHead();

private:
    queue<TYPE> m_stQueue1;
    queue<TYPE> m_stQueue2;
};

template <typename TYPE>
TYPE CStack<TYPE>::DeleteHead()
{
    TYPE head;
    if (m_stQueue1.empty())
    {
        while (m_stQueue2.size() > 1)
        {
            m_stQueue1.push(m_stQueue2.front());
            m_stQueue2.pop();
        }

        head = m_stQueue2.front();
        m_stQueue2.pop();
    }
    else
    {
        while (m_stQueue1.size() > 1)
        {
            m_stQueue2.push(m_stQueue1.front());
            m_stQueue1.pop();
        }

        head = m_stQueue1.front();
        m_stQueue1.pop();
    }

    return head;
}

template <typename TYPE>
void CStack<TYPE>::AppendTail(const TYPE& value)
{
    m_stQueue1.push(value);
}

void StackWithTwoQueueTestFunc()
{
    cout << "\n\n --------------- StackWithTwoQueueTestFunc Start -------------->" << endl;
    CStack<int> stStack;
    stStack.AppendTail(1);
    stStack.AppendTail(2);
    stStack.AppendTail(3);

    cout << "Stack Pop Node: " << stStack.DeleteHead() << endl;

    stStack.AppendTail(4);
    stStack.AppendTail(5);
    stStack.AppendTail(6);
    cout << "Stack Pop Node: " << stStack.DeleteHead() << endl;
    cout << "Stack Pop Node: " << stStack.DeleteHead() << endl;
    cout << "Stack Pop Node: " << stStack.DeleteHead() << endl;
    cout << "Stack Pop Node: " << stStack.DeleteHead() << endl;
    cout << "Stack Pop Node: " << stStack.DeleteHead() << endl;

    cout << "\n\n --------------- StackWithTwoQueueTestFunc End -------------->" << endl;

}

原文地址:https://www.cnblogs.com/yzdai/p/11258619.html

时间: 2024-10-13 21:38:14

题目七:用两个栈实现队列的相关文章

剑指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

利用两个栈模拟队列

/************************************************** 题目:用两个栈模拟队列的基本操作1入队2,出队3判断队空4判断队满 s1做为输入栈的元素,一个个压栈相当于入队 s2作为输出队列的元素, 一个个出栈相当于出队 *************************************************/ #include <iostream> #include <cstdio> using namespace std; c

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

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

剑指offer【05】- 用两个栈实现队列(java)

题目:用两个栈实现队列 考点:栈和队列 题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:每次psuh是时先将stack2清空放入stck1(保证选入的一定在栈底),stack2始终是用来删除的.在pop前,先将stack1中中的数据清空放入stack2(保存后入的在栈底),stack1始终用于push. 1 import java.util.Stack; 2 3 public class Solution { 4 Stack<Intege

用两个栈实现队列

题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. template <typename T>class CQueue { public: CQueue(void); ~CQueue(void); void appendtail(const T& node); T deleteHead(); private: stack<T> stack1; stack<T&

用两个栈实现队列-剑指Offer

用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 一个栈的顺序是“后进先出”,再用一个栈把顺序颠倒过来就满足队列的“先进先出”规则了 用两个stack实现,stack1负责进队列,然后从stack2弹栈出队列,若stack2为空,再从stack1弹出到stack2 代码 import java.util.Stack; public class Solution { Stack<Integer> stack1 = new St

【数据结构】用两个栈实现队列

惯例.看题: 题目:用两个栈实现一个队列.队列的声明如下.请实现它的两个函数appendTail和deleteHead,分别完成对也尾部插入节点和队列头部删除节点的功能. 队列结构:     template<typename T> class CQueue     {      public:         CQueue(void);         ~CQueue(void);                  void appendTail(const T & node);  

剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈

题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能. 我们通过一个具体的例子来分析该队列插入和删除元素的过程.首先插入一个元素a,不妨先把它插入到stack1,此时stack1 中的元素有{a},stack2为空.再压入两个元素b和c,还是插入到stack1中,此时stack1中的元素有{a,b,c},其中c位于栈顶,而stack2仍然为空. 这个时候,我们试着删除从队列中删除一个元素.

剑指offer系列-用两个栈实现队列

oj地址 题目1512:用两个栈实现队列 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2360 解决:804 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 输入: 每个输入文件包含一个测试样例. 对于每个测试样例,第一行输入一个n(1<=n<=100000),代表队列操作的个数. 接下来的n行,每行输入一个队列操作: 1. PUSH X 向队列中push一个整数x(x>=0) 2. POP 从队列中pop一个数. 输出: