题目:输入两个整数序列。其中一个序列表示栈的push顺序,
判断另一个序列有没有可能是对应的pop顺序。假设压入栈的所有数字均不相等。
方法一:使用栈模拟
bool popIsPushOrder(int *ppush, int pushLen, int *ppop, int popLen)
{
bool isorder = false;
if(ppush != NULL && ppop != NULL && pushLen > 0 && popLen > 0){
int pushindex = 0, popindex = 0;
int topvalue = 0;
stack<int> stk;
while(popindex < popLen){
stk.push(ppush[pushindex++]);
while(popindex < popLen && !stk.empty){
topvalue = stk.top();
if(ppop[popindex] == topvalue){
stk.pop();
popindex++;
}
else if(pushindex == pushLen){
return false;
}
else{
break;
}
}
}
if(popindex >= popLen) isorder = true;
}
return isorder;
}
方法二:采用逻辑模拟
bool PushPop(int* push, int push_num, int* pop, int pop_num){
int i =0,j = 0;//i指向入栈的序列,j指向出栈的序列
while(j<pop_num){
//向前找一个,就是找当前栈顶元素是不是Pop对应的
if(i>0){
while(i>0 && push[i]==-1)
i--;
if(i>=0 && push[i]!=-1){
if(push[i]==pop[j]){
//把前一个再pop出来了
push[i]=-1;
j++;
continue;
}
}
}
//向后找
while(i<push_num && push[i]!=pop[j])
i++;
if(i<push_num && push[i]==pop[j]){
push[i] = -1;
}else{
cout<<i<<" "<<j<<endl;
return false;
}
j++;
}
return true;
}