47. 腾讯面试题: 用两个栈实现队列

题目:某队列的声明如下:


template<typename T, int MAXSIZE>
class Stack;

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

        void appendTail(const T& node);
        void deleteHead();
        void pop(T& node);
private:
        Stack<T, 1024> m_stack1;
        Stack<T, 1024> m_stack2;
};


分析:

从上面队列的声明,可以看出队列CQueue实现是使用两个栈m_stack1和m_stack2,

一个栈用于插入数据:

m_stack1.push(data)

如插入数据:1,2,3,4,5,6

一个栈用于取数据:

这时可以把m_stack1里面的内容放入到m_stack2中,这样插入m_stack2的顺序为:

6,5,4,3,2,1

这样 m_stack2.pop() 是不是就是 1,2,3,4,5了。


看看直观的图如下:



实现如下:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>

using namespace std;

template<typename T, int MAXSIZE>
class Stack;

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

        void appendTail(const T& node);
        void deleteHead();
        void pop(T& node);
private:
        Stack<T, 1024> m_stack1;
        Stack<T, 1024> m_stack2;
};

template<typename T, int MAXSIZE=1024>
class Stack{
private:
        T data[MAXSIZE];
        int pos;
public:
        Stack():pos(0){}
        bool empty()
        {
                return pos == 0;
        }
        bool full()
        {
                return pos == MAXSIZE;
        }
        bool get(T& _value)
        {
                if(empty()) return false;
                _value = data[pos-1];
                return true;
        }
        bool pop(T& _value)
        {

        {
                if(empty()) return false;
                _value = data[--pos];
                return true;
        }
        bool push(const T& _value)
        {
                if(full()) return false;
                data[pos] = _value;
                pos ++;
                return true;
        }
};

template <typename T> void CQueue<T>::appendTail(const T& node)
{
        //if(!m_stack1.full()) m_stack1.push(node);//这有个问题:这个队列顶多只有1024个空间,实际队列可存储的空间最多为2048,没能很好的利用空间<span style="white-space:pre">	if(m_stack1.full())
        //如果m_stack1满了,判断下m_stack2是否为空,如果为空,则把m_stack1的内容插入到 m_stack2中,>
否则插入失败。
        {
                if(!m_stack2.empty()) return;
                T node1;
                while(!m_stack1.empty())
                {
                        m_stack1.pop(node1);
                        m_stack2.push(node1);
                }
        }
        m_stack1.push(node);</span>
<span style="white-space:pre">	</span>
}

template <typename T>
void CQueue<T>::deleteHead()
{
        T _node;
        if(m_stack2.empty())
        {
                while(!m_stack1.empty())
                {
                        m_stack1.pop(_node);
                        m_stack2.push(_node);
                }
        }
        m_stack2.pop(_node);
}

template <typename T>
void CQueue<T>::pop(T&node)
{
        if(m_stack2.empty())
        {
                T _node;
                while(!m_stack1.empty())
                {
                        m_stack1.pop(_node);
                        m_stack2.push(_node);
                }
        }
        m_stack2.pop(node);
}

int main()
{
        CQueue<int> q;
        int i = 1;
        cout << "insert queue: " << endl;
        while(i < 10)//
        {
                cout << i << ",";
                q.appendTail(i++);
        }

        cout << endl << "pop queue: " << endl;
        while( i> 1)
        {
                int k = -1;
                q.pop(k);
                cout << k << ",";
                i --;
        }
        return 0;
}

输出结果为:

insert queue: 
1,2,3,4,5,6,7,8,9,
pop queue: 
1,2,3,4,5,6,7,8,9,







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值