1.需求
给定两个序列,分别为入栈序列和出栈序列,判断出栈序列是否合理, 注:入栈时可能不是一次性全部入栈,也可能不是一次性全部出栈
2.示例
例如——
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。
3.思路分析
- 首先确定要排除特殊情况,比如给定序列为空或者给定的序列长度是否越界
- 其次,将入栈序列依次入栈
1)判断出栈序列是否与当前栈顶元素相同,如果相同则删除栈顶元素, 栈顶指针回退; - 判断栈顶指针是否指向-1,若指向-1,则返回true,否则返回false;
4.代码展示
bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
//pushed 入栈系列 popped 出栈序列 pushedSize入栈序列的元素长度
if(pushed==NULL||popped==NULL||pushedSize<0||popped<0){
return false;
}
if(poppedSize>1000||pushedSize>1000){
return false;
}
//声明一个数组
int stacked[1000]={0};
//栈顶指针
int stackTop=-1;
// 当前入栈数
int pushStacked=0;
//当前出栈数
int popStacked=0;
while(pushStacked<pushedSize){
//入栈
stacked[++stackTop]=pushed[pushStacked++];
while(stackTop>=0&&popStacked<poppedSize&&stacked[stackTop]==popped[popStacked]){
//在上述条件成立的前提下出栈
stacked[stackTop--]=0;
popStacked++;
}
}
if(stackTop==-1){
return true;
}
return false;
}
5.要注意的点
我们具体操作的还是数组,只是使用的是对栈操作时的逻辑结构,比如说
栈顶指针啦,加上栈顶指针指向的话会好理解很多。