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

来源:互联网 发布:软件系统安全保密设计 编辑:程序博客网 时间:2024/06/15 14:29

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


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,







0 0
原创粉丝点击