不像俩个栈实现队列,两次先进后出之后就是先进先出,队列几次先进先出仍然是先进先出,那么我们看看实际情况,将队列里除最后一个以外,全都拿走,剩下的这最后一个就是想要的结果,那么先前拿走的那些放哪里呢?给了两个队列,那就放在另外一个队列里。若是在出的话,就对另一个队列进行相同的操作。
template<class valueType>
class MyStack{
public:
MyStack() { push_queue = 0;}
valueType pop();
void push(const valueType& );
private:
// int queueNumbers;
std::queue<valueType> Queue1;
std::queue<valueType> Queue2;
char push_queue;
private:
std::queue<valueType>& PushQueue(){
if(push_queue == 0)
return Queue1;
else
return Queue2;
}
std::queue<valueType>& PopQueue(){
if(push_queue == 1)
return Queue1;
else
return Queue2;
}
};
template<class valueType>
void MyStack<valueType>::push(const valueType& value){
PushQueue().push(value);
}
template<class valueType>
valueType MyStack<valueType>::pop(){
assert(!PushQueue().empty());
while (PushQueue().size() != 1)
{
PopQueue().push(PushQueue().front());
PushQueue().pop();
}
valueType cur_front = PushQueue().front();
PushQueue().pop();
push_queue = !push_queue;
return cur_front;
}
这个实现的过程中,每次出栈,都要将队列里的元素折腾一次,其实也不用两个队列,用一个队列就好了,把最后一个之前的元素出队再入队就行了。
template<class valueType>
class MyStack2{
public:
void push(const valueType& );
valueType pop();
private:
std::queue<valueType> Queue;
};
template<class valueType>
void MyStack2<valueType>::push(const valueType& value){
Queue.push(value);
}
template<class valueType>
valueType MyStack2<valueType>::pop(){
assert(!Queue.empty());
int queueLen = Queue.size();
int index = 0;
while(index < queueLen - 1){
Queue.push(Queue.front());
Queue.pop();
index++;
}
valueType front_val = Queue.front();
Queue.pop();
return front_val;
}