利用队列实现栈
话不多说,直接上思路
所需条件:两个队列
思路:队列间相互调动元素法
我们举例讲解:
操作: push(1) , push(2) , pop(), push(3) , pop(), push(1) ,
按照栈的机制应该是(置顶而下):
-
1
-
2,1
-
1,
-
3,1
-
1,
-
1,1
我们使用队列模拟这种机制:
入栈:入栈时我们将其元素 push 有元素的队列尾部,始终保持一个队列保持有元素,一个队列保持无元素。
出栈:出栈时,将有元素的队列逐个 pop 并添加到无元素的队列中,直到 size 剩余 1,之后记录其值作为返回值,之后再次pop,保证该队列为空。
这样就是: push(1) , push(2) , pop(), push(3) , pop(), push(1) ,
- queue1: 1 queue2: empty
- queue1: 1,2 queue2:empty
- queue1: empty queue2:1
- queue1: empty queue2:1,3
- queue1: 1 queue2:empty
- queue1: 1,1 queue2:empty
直截了当,上代码
- 遵从模板编程原则
测试用例
- 往空的栈删除元素
- 往非空的栈间断的添加删除元素
- 连续删除直到栈为空
template <typename T> class CStack{
public:
CStack()= default;
~CStack()= default;
void push_elem(const T &element);
T pop_elem();
private:
std::queue<T> queue1;
std::queue<T> queue2;
};
void CStack<T>::push_elem(const T &element) {
std::queue<T> &tempQue = (queue1.size()>queue2.size() ? queue1:queue2);
tempQue.push(element);
}
template<typename T>
T CStack<T>::pop_elem() {
std::queue<T> &mainQue = (queue1.size()>queue2.size() ? queue1:queue2);
if(mainQue.size()<=0) std::cerr<<"Stack is empty!"<<std::endl;
std::queue<T> &otherQue = (mainQue == queue1 ? queue2: queue1);
while(mainQue.size()>1){
otherQue.push(mainQue.front());
mainQue.pop();
}
T elem = mainQue.front();
mainQue.pop();
return elem;
}