利用栈实现队列
直截了当讲思路
思路:
我们了解的队列操作思路(主要讲出队入队操作)
例子: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: 2,1 stack2:empty
- stack1: empty stack2:1,2 -》 出队后 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;
}