-
借用示例一数据。
-
大概思路:创建一个辅助数组a[5],先将pushed[0]存入a[0]中,再将a[0]与popped[0]比较,若不相等,则继续将pushed数组中元素压栈a数组中,若相等,则出栈a数组元素,以此类推,直到pushed数组遍历完。 具体实现:主要是考虑下标问题,关于数组遍历是采用先++还是后++,这里采用先++,因为这样p,q,top,都是实时指向当前值,而后++会使p,q,top指向它的下一个下标,先暂时不管。
-
起始时我们设置pushed数组下标p=0,popped数组下标q=0,a数组下标top=0,先将pushed[0]存入a[0]中,再将a[0]与popped[0]比较,若不同,则a[++top]=pushed[++p],若相同,则top--,q++,此时p,q,top,都是实时记录当前元素位置的,直到碰到4,与popped数组第一个元素相同,则top--,q++(因为当前元素相同,所以出栈,检验top--的数据和popped数组p++的数进行比较,只有确定了top--的数据和p++的数值不相等时才继续遍历pushed数组,这也是为什么用先++的原因,因为比较a[top-1]与popped[p+1]不同时,可以在a数组当前位置的后一位置继续进行插入操作,而不覆盖当前位置的值。
那么终止条件是什么?我们知道,即使p指向5了,a数组与popped数组的比较可能还没停止,如果此题返回true,那么top最终值将会是-1,q的值将会是5,如果继续执行程序,数组下标将越界。这时我们只需要将a数组与popped数组比较条件添加一个top>=0即可,退出条件为p==pushedSize-1。
bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
int p=0,q=0,top=0,a[pushedSize];
a[0]=pushed[0];
while(1)
{
if(top>=0&&a[top]==popped[q])
{
top--;
q++;
}
else
{
if(p==pushedSize-1)
break;
a[++top]=pushed[++p];
}
}
return q==poppedSize;
}