栈的pop序列和push序列。一个pop序列,一个push序列,如何判断pop序列可以有push序列产生。

pop序列为[1,2,3,4,5],push序列为[1,2,3,4,5],pop序列可以由push序列产生。分析如下:
1push pop
2push pop
3push pop
4push pop
5push pop
栈的特性就是先进后出,设两个序列长度为L,我们在判断某个pop序列是否可以有一个push序列产生的时候,通过把push序列进栈stackint,然后判断栈顶元素是否为pop序列的元素,是就pop,不是就挨个遍历,当push序列便利到L的时候,推出遍历。然后stackint是否为空,为空,就是可以,否则,就不可以。
#include
#include
using namespace std;
bool pushAndPop(int poparr[],int pusharr[],int length)
{
int ipop = 0;
int ipush = 0;
stack pushstack;
pushstack.push(pusharr[ipush]);//先把pusharr序列的第一个元素压入堆栈。(后面的实际上不用)
ipush++;
while (ipop < length && ipush <= length)//这个必须是等于号,保证push序列最后一个入栈之后,依然可以进行栈顶元素比较。
{
if (!pushstack.empty() && pushstack.top() == poparr[ipop])//pushstack.empty() 这个必须先于后一个条件判断,因为当pushstack为空的时候,没法取pushstack.top() 元素,会报错误。引起程序崩溃。
{
pushstack.pop();元素和栈顶元素相等的时候,pop,同时ipop加1,机型下一个元素比较。
ipop++;
}
else
{
if (ipush >= length)//最后一个push元素进站之后,ipush=length,如果上面比较失败还是会进栈,导致异常,直接判断ipush>=length退出即可。
{
break;
}
pushstack.push(pusharr[ipush]);当栈顶元素和ipop位置的元素不相等的时候,一直压栈。
ipush++;
}
}
if (pushstack.empty())//判断栈是否为空,来确定push是否可以产生pop序列。
{
return true;
}
else
{
return false;
}
}
int main()
{
int poparr[5] = { 4,2,3,1,5};
int pusharr[5] = { 1,2,3,4,5 };
if (pushAndPop(poparr,pusharr, 5))
{
cout << “push can make pop” << endl;
}
else
{
cout << “push can not make pop” << endl;
}

system("pause");
return 0;

}
栈的使用在算法中很重要。在去栈顶元素的时候,先判断栈是否为空是个好习惯。切记切记。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值