栈的压入、弹出序列

title:

栈的压入、弹出序列:输入两个整数序列,第一个是压入序列,判断第二个是不是栈的弹出序列


thought:

利用一个辅助栈:按照输入的第二个序列,将第一个序列的数据依次压入栈

判断一个序列是不是栈的弹出序列的规律:
如果下一个弹出的数据(由第二个序列决定)刚好是栈顶元素,则直接弹出;
如果下一个弹出的数字不在栈顶,把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈为止;

如果入栈序列的所有数据都入栈了仍然没有找到下一个弹出的数字,则该序列不可能是一个弹出序列。

bool IsPopOrder(const int p_push[],const int p_pop[],int length)
{
	bool Is_pop = false;
	if(p_push != NULL && p_pop != NULL && length > 0)
	{
	  stack<int> popstack;
	  const int *push_next = p_push;
	  const int *pop_next = p_pop;
	  while (pop_next-p_pop < length)  //根据弹出序列来确定入栈的顺序
	  {
		  while (popstack.empty() || popstack.top() != *pop_next) // 栈顶元素不等于弹出元素
		  {
			  if(push_next-p_push == length) //到达入栈序列的尾部(即已经没有元素可以入栈)
				  break;
			  popstack.push(*push_next);  //当辅助栈的栈顶元素不等于弹出序列元素时,将入栈序列中未入栈的元素压入(直至辅助栈的栈顶元素等于弹出元素或者到达入栈序列的尾部)
			  push_next++;
		  }
		  if (popstack.top() != *pop_next)
		        break;
		  popstack.pop();
		  pop_next++;
	  }
	  if(popstack.empty() && pop_next-p_pop == length)
		  Is_pop = true;
	}
	return Is_pop;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值