您的位置:首页 > 职场人生

【剑指offer】面试题7:两个栈实现队列

2014-05-18 16:49 441 查看
将两个栈封装成为一个队列,使其具有队列的性质,可以进行相应的操作。

分析:

栈的后进先出特性执行两次,就成了先进先出,这就满足了队列的性质。

实现:

我们用一个栈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.
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: