题目:输入两个整数序列。其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序。
为了简单起见,我们假设 push 序列的任意两个整数都是不相等的。
比如输入的 push 序列是 1、2、3、4、5,那么 4、5、3、2、1 就有可能是一个 pop 系列。
因为可以有如下的 push 和 pop 序列:
push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
这样得到的 pop 序列就是 4、5、3、2、1。
但序列 4、3、5、1、2 就不可能是 push 序列 1、2、3、4、5 的 pop 序列。
分析:
如果我们希望 pop 的数字正好是栈顶数字,直接 pop 出栈即可;
如果希望 pop 的数字目前不在栈顶,我们就到push 序列中还没有被 push 到栈里的数字中去搜索这个数字,并把在它之前的所有数字都 push 进栈。
如果所有的数字都被 push 进栈仍然没有找到这个数字, 表明该序列不可能是一个 pop 序列。
程序:
#include <iostream>
#include <stack>
using namespace std;
int check(int input[],int output[],int n)
{
stack<int> st;
int j=0;
for(int i=0;i<n;i++)
{
cout<<"i= "<<i<<endl;
if(st.empty())//栈为空,把output[i]入栈。
{
while(j<n && input[j]!=output[i])
st.push(input[j++]);
if(j==n)
return 0;//不符合,因为input中没有output[i]这个元素
j++;//跳过output[0]这个值,相当于先push后pop。
}
else//栈不为空
{
if( st.top()!=output[i] )//不是栈顶元素,就从待入栈中找
{
while(j<n && input[j]!=output[i])
st.push(input[j++]);
if(j==n)
return 0;//没有找到output[i],不符合
}
else//如果是栈顶元素,出栈
{
st.pop();
}
}
}
return 1;//出栈结束了
}
void main()
{
int input[5]={1,2,3,4,5};
int output[5]={4,5,3,1,2};
cout<<"结果 "<<check(input,output,5)<<endl;
system("pause");
}