将两个栈封装成为一个队列,使其具有队列的性质,可以进行相应的操作。
分析:
栈的后进先出特性执行两次,就成了先进先出,这就满足了队列的性质。
实现:
我们用一个栈stack_push来实现队列的push操作,用栈stack_pop来实现队列的pop操作。
在push时,我们只管向stack_push中插入,因为这里没涉及到出,所以没有什么顺序可言。
在pop时,从stack_push里直接pop肯定不行,不符合队列的特性,那么我们就借助stack_pop,我们将stack_push里的元素再次入到stack_pop里,那么stack_push里的元素顺序在stack_pop里就满足队列的性质了,但是这里会出现情况,因为队列的操作中,插入和删除是随机的,也就是说,在我们将stack_push里的元素导入到stack_pop时,stack_pop肯是空的,也可能不是空的,若不是空的就直接导入,会将原来的元素给压在下面,使得本来在队头的被压在了后面,这样就明显不对了,所以,在stack_pop里有元素的时候,我们要将他们先出队,这才是正体的队首,在stack_pop为空时,我们才考虑将stack_push里的元素压入,来进行pop操作,当stack_push也空的时候,说明已经没有元素来出队了, 这时进行出队就是错误的操作。
template<class valueType>
class MyQueue{
public:
void appendTail(const valueType&);
valueType delteHead();
private:
stack<valueType> stack_pop;
stack<valueType> stack_push;
};
template<class valueType>
void MyQueue<valueType>::appendTail(const valueType& value)
{
stack_push.push(value);
}
template<class valueType>
valueType MyQueue<valueType>::delteHead(){
assert(!stack_push.empty() || !stack_pop.empty());
if(stack_pop.empty())
{
while (!stack_push.empty())
{
stack_pop.push(stack_push.top());
stack_push.pop();
}
}
valueType cur_top = stack_pop.top();
stack_pop.pop();
return cur_top;
}
void main(){
typedef int valueType;
MyQueue<valueType> mq;
mq.appendTail(3);
mq.appendTail(4);
valueType t = mq.delteHead();//t == 3
mq.delteHead();//mq is empty
mq.delteHead();//assert.
}