栈与队列:如何闲情雅致地理解栈实现队列?

直截了当讲思路

思路:
我们了解的队列操作思路(主要讲出队入队操作)

例子:push(1) , push(2) , pop(), pop(), push(3)

  • queue: 1
  • queue: 1 , 2
  • queue: 2
  • queue: empty
  • queue: 3

如何利用栈来模拟队列的操作呢?

所需条件: 两个栈,stack1,stack2,一个做出队操作栈,一个做入队操作栈(详细下面介绍)

入队:入队栈(stack1)直接push 其元素即可
出队:出队栈(stack2)无元素时,入队栈(stack1)pop 出全部元素并逐个添加到出队栈中,这样出队栈的出栈元素与队列的正常顺序就保持一致了,随后如果出队栈有元素时,执行出队操作,直接pop出队栈元素即可。

演示步骤:push(1) , push(2) , pop(), pop(), push(3)

栈的元素顺序为从上至下:

 - stack1: 1         stack2:empty
 - stack1: 21      stack2:empty
 - stack1: empty     stack2:12  -》 出队后  2
 - stack1: empty     stack2:empty
 - stack1: 3         stack2:empty



躁人之词多,话多伤气 ,我就不废话了,上代码

  • 遵从模板编程原则

测试用例:

  • 往空队列中添加,删除元素
  • 往非空队列里添加,删除元素
  • 连续删除元素直到队列为空。
//两个栈实现一个队列
template <typename T> class CQueue{
public:
    CQueue()= default;
    ~CQueue()= default;

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

private:
    std::stack<T> stack1;
    std::stack<T> stack2;
};
template<typename T>
void CQueue<T>::appendTail(const T &element) {
    stack1.push(element);
}


template<typename T> 
T CQueue<T>::deleteHead() {
    if(stack2.size()<=0){
        while(stack1.size()>0){
            stack2.push(stack1.top());
            stack1.pop();
        }
    }
    if(stack2.size()<=0)
        std::cerr<<"current queue is empty!"<<std::endl;
    T head = stack2.top();
    stack2.pop();
    return head;
}






猜你喜欢

转载自blog.csdn.net/chongzi_daima/article/details/104997912