日常编程练习(四)

栈是先进后出,队列是先进先出

一、两个栈实现队列

只要考虑一个栈作为输入,另一个栈作为输出即可

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

    void appendTail(const T&);
    T deleteHead();

private:
    stack<T> stack1;
    stack<T> stack2;
} ;

template <typename T>
void CQueue<T>::appendTail(const T& node)
{
    stack1.push(node);
}

template <typename T>
T CQueue<T>::deleteHead()
{
    if(stack2.empty()&&stack1.empty())
        return -1;
    T res;
    if(stack2.empty())
    {
        while(stack1.size()>1)
        {
            stack2.push(stack1.top());
            stack1.pop();
        }
        res=stack1.top();
        stack1.pop();
    }
    else
    {
        res=stack2.top();
        stack2.pop();
    }
    return res;
}

二、两个队列实现栈

两个队列无论怎么转换先进先出的顺序是不会改变的,所以队顶的数永远是最后输出,因而每次输入直接加到有值队列即可,输出时获取有值队列最后一个值,并将之前的转换到另一个队列。

template <typename T>
class Cstack
{
public:
    Cstack(void){}
    ~Cstack(void){}
    void Cpush(const T&);
    void Cpop();
    T Ctop();

private:
    queue<T> queue1;
    queue<T> queue2;
};

template <typename T>
void Cstack<T>::Cpush(const T& data)
{
    if(!queue2.empty())
        queue2.push(data);
    else
        queue1.push(data);
}

template <typename T>
void Cstack<T>::Cpop()
{
   if(queue1.empty()&&queue2.empty())
        return;
   if(!queue1.empty())
    {
        while(queue1.size()>1)
        {
            queue2.push(queue1.front());
            queue1.pop();
        }
        queue1.pop();
    }
    else if(!queue2.empty())
    {
        while(queue2.size()>1)
        {
            queue1.push(queue2.front());
            queue2.pop();
        }
        queue2.pop();
    }
}

template <typename T>
T Cstack<T>::Ctop()
{
    if(queue1.empty()&&queue2.empty())
        return -1;
    T res;
    if(!queue1.empty())
    {
        while(queue1.size()>1)
        {
            queue2.push(queue1.front());
            queue1.pop();
        }
        res=queue1.front();
        queue2.push(queue1.front());
        queue1.pop();
    }
    else if(!queue2.empty())
    {
        while(queue2.size()>1)
        {
            queue1.push(queue2.front());
            queue2.pop();
        }
        res=queue2.front();
        queue1.push(queue2.front());
        queue2.pop();
    }
    return res;
}

 

posted on 2017-05-08 15:48  kiplove  阅读(198)  评论(0编辑  收藏  举报

导航