AB2 栈的压入、弹出序列
牛客:
问题描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
- 0<=pushV.length == popV.length <=1000
- -1000<=pushV[i]<=1000
- pushV 的所有数字均不相同
AC代码
栈stack,后进先出。
首先考虑极端情况,出栈的值并不存在入栈列表里。直接返回false。
否则,循环出栈列表,进行3种情况判断:
1、该值没有入栈,则修改状态为0, 直接出栈。
2、该值已经入栈,需要确保前一个值已经出栈,否则false。
3、该值已经出了。直接false。
#include <cstddef>
#include <cstdio>
#include <stack>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pushV int整型vector
* @param popV int整型vector
* @return bool布尔型
*/
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
// write code here
bool val = true;
int stack_size = popV.size();
int state[stack_size];
for(int i=0;i<stack_size;i++)
state[i] = -1;
for(int i=0; i<stack_size;i++){
int temp_x = popV[i];
int ord = -1;
for (int j = 0;j<stack_size;j++) {
if(temp_x == pushV[j])
ord = j;
}
if(ord == -1){
val = false;
break;
}
if(state[ord] == -1){//没入
for (int k =ord;k>=0;k--) {
if(state[k]==-1)//没入 和 没出 的才入
state[k] = 1; //入
else
break;
}
state[ord] = 0;
}
else if(state[ord] == 1){//已入
for(int k=ord+1;k<stack_size;k++){
if(state[k]==-1 || state[k] == 1){
val = false;
break;
}
else {
break;
}
}
if (val) {
state[ord] = 0;
}
}
else { //已出
val = false;
break;
}
// for(int jj =0 ;jj<stack_size ;jj++)
// printf("%d ",state[jj]);
// printf("\n");
}
return val;
}
};