【剑指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也空的时候,说明已经没有元素来出队了,
这时进行出队就是错误的操作。
分析:
栈的后进先出特性执行两次,就成了先进先出,这就满足了队列的性质。
实现:
我们用一个栈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. }
相关文章推荐
- 【剑指offer】2.3.5栈和队列——面试题7:用两个栈实现队列
- 剑指offer之面试题7用两个栈实现一个队列
- 剑指offer--面试题7:用两个栈实现队列--Java实现
- 剑指Offer----面试题七:用两个栈实现队列
- 【剑指offer 面试题7】用两个栈实现队列
- 剑指offer之面试题7:用两个栈实现队列
- 剑指Offer面试题7用两个栈实现队列
- 剑指Offer面试题7:用两个栈实现队列 Java实现
- 剑指offer--面试题7: 用两个栈实现队列
- 剑指offer面试题7:用两个栈实现队列
- 【剑指Offer面试题】 九度OJ1512:用两个栈实现队列
- 剑指offer 面试题7 两个栈实现队列
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- 剑指offer面试题java实现之题7:用两个栈模拟一个队列的入队和出队操作
- 【剑指offer】面试题7:用两个栈实现队列
- 剑指offer面试题7——用两个栈实现队列
- 剑指Offer:面试题7 用两个栈实现队列
- 【剑指offer】面试题七:用两个栈实现队列
- [剑指offer][面试题07-扩展]用两个队列实现栈
- [剑指offer][面试题07]用两个栈实现队列