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

将两个栈封装成为一个队列,使其具有队列的性质,可以进行相应的操作。

分析:

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

实现:

我们用一个栈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.
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值