输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
1. 0<=pushV.length == popV.length <=1000
2. -1000<=pushV[i]<=1000
3. pushV 的所有数字均不相同
[1,2,3,4,5],[4,5,3,2,1]
true
可以通过push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop() 这样的顺序得到[4,5,3,2,1]这个序列,返回true
[1,2,3,4,5],[4,3,5,1,2]
false
由于是[1,2,3,4,5]的压入顺序,[4,3,5,1,2]的弹出顺序,要求4,3,5必须在1,2前压入,且1,2不能弹出,但是这样压入的顺序,1又不能在2之前弹出,所以无法形成的,返回false
int top=0; int a[100000]; void push (int x); void pop(int x); int Check(int k); bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) { int i,k=0; for(i=0;i<pushVLen;i++) { push(pushV[i]); if (pushV[i]==popV[k]) { pop (pushV[i]); k++; while (1) { if (Check(popV[k])==0) break; k++; } } } printf("%d",k); if (k==popVLen) return true; else return false; } void push (int x) { top++; a[top]=x; } void pop(int x) { top--; } int Check(int k) { if (top<1) return 0; else { if (a[top]==k) { top--; return 1; } else return 0; } }
typedef struct lnode { int data; struct lnode* next; } node, *stack; void Push(stack* top, int x) { stack cur = (stack)malloc(sizeof(node)); cur->data = x; cur->next = *top; *top = cur; } void Pop(stack* top) { if (*top == NULL) { return; // Handle underflow if needed } *top = (*top)->next; } bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen) { stack s=NULL; int j = 0; for (int i = 0; i < pushVLen; i++) { Push(&s, pushV[i]); while (s != NULL && s->data == popV[j] && j < popVLen) { Pop(&s); j++; } } return (s == NULL && j == popVLen); }
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pushV int整型一维数组 * @param pushVLen int pushV数组长度 * @param popV int整型一维数组 * @param popVLen int popV数组长度 * @return bool布尔型 */ bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) { // write code here int temp[pushVLen],top = 0; int i = 0,j = 0; while(i<pushVLen) { temp[top++] = pushV[i++]; while(top>0&&j<popVLen&&temp[top-1]==popV[j]) { j++; top--; } } return top==0; }
#include <stdbool.h> #include <stdio.h> #define INVALID -1001 int FindIdx(int* pushV, int pushVLen, int val) { for (int i = 0; i < pushVLen; i++) { if (pushV[i] == val) { pushV[i] = INVALID; return i; } } return -1; } bool FindToLeft(int* pushV, int pushVLen, int* idx,int val) { if (*idx - 1 < 0) return false; if (pushV[*idx - 1] != INVALID && pushV[*idx - 1] == val) { *idx = *idx - 1; pushV[*idx] = INVALID; return true; } int i = *idx - 2; if (i < 0) return false; for (i = *idx - 2; i >= 0; i--) { if (pushV[i] != INVALID) break; } if (i >= 0 && pushV[*idx - 1] == INVALID &&pushV[i] == val) { *idx = i; pushV[i] = INVALID; return true; } return false; } bool FindToRight(int* pushV, int pushVLen, int* idx,int val) { if(*idx+1>=pushVLen) return false; for (int i = *idx +1; i < pushVLen; i++) { if (pushV[i] != INVALID && pushV[i] == val) { *idx = i; pushV[i] = INVALID; return true; } } return false; } bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) { // write code here int idx = -1; idx = FindIdx(pushV, pushVLen, popV[0]); if(idx == -1) return false; for (int i = 1; i < popVLen; i++) { if (!FindToLeft(pushV, pushVLen, &idx,popV[i]) && !FindToRight(pushV, pushVLen, &idx,popV[i])) return false; } return true; }
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pushV int整型一维数组 * @param pushVLen int pushV数组长度 * @param popV int整型一维数组 * @param popVLen int popV数组长度 * @return bool布尔型 */ bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) { // write code here int temp[pushVLen],top = -1; int i = 0,j = 0; while(i<pushVLen) { temp[++top] = pushV[i++]; while(top>-1&&j<popVLen&&temp[top]==popV[j]) { j++; top--; } } if(i==pushVLen&&j==popVLen) return true; else return false; }
bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) { // write code here int stack[1000], top = 0, *p1 = pushV, *p2 = popV; while (p1 < pushV + pushVLen) { while(*p1 != *p2) { stack[top++] = *p1; p1++; } if (*p1 == *p2) p2++, p1++; while(top > 0 && stack[top - 1] == *p2) { top--, p2++; } } if (top < 1) return true; else return false; }有什么问题吗?兄弟们,百思不得其解
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pushV int整型一维数组 * @param pushVLen int pushV数组长度 * @param popV int整型一维数组 * @param popVLen int popV数组长度 * @return bool布尔型 */ typedef struct { int* data; int top; int maxlen; } stack, *stackp; stackp stack_create(int len); int stack_push(stackp s, int data); int stack_pop(stackp s); int stack_top(stackp s); bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) { int i, j = 0; stackp s; s = stack_create(pushVLen); for (i = 0; i < pushVLen; i++) { stack_push(s, pushV[i]); //压栈 while (stack_top(s) == popV[j] && j < popVLen && s->top != -1) { //当栈定元素和出栈表j指向元素相等时,循环多次判断出栈 stack_pop(s); j++; } } if (j == popVLen) //最后,如果出栈表出完,则出栈表可行 return true; else return false; } stackp stack_create(int len) { stackp s; if ((s = (stackp)malloc(sizeof(stack))) == NULL) { puts("malloc failed !"); return NULL; } if ((s->data = (int*)malloc(len * sizeof(int))) == NULL) { puts("malloc failed !"); return NULL; } s->maxlen = len; s->top = -1; return s; } int stack_push(stackp s, int data) { if (s->top == s->maxlen - 1) { puts("stack is full"); return -1; } s->top++; s->data[s->top] = data; return 1; } int stack_pop(stackp s) { if (s->top == -1) { puts("stack is empty"); return 0; } int tmp; tmp = s->data[s->top]; s->top--; return tmp; } int stack_top(stackp s) { if (s->top == -1) { puts("stack is empty"); return 0; } return s->data[s->top]; }
bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) { int stack[1001]={1001}; int base=0,top=1; int i=0,j=0,m=0; for(i=0;i<pushVLen;i++)//初始化成1001 stack[i]=1001; for(i=0;i<popVLen;i++) { if(stack[top-1]==popV[i])//和栈顶相不相等,相等出栈 { top--; stack[top]=1001; } else//不相等,去压入栈找 { if(m<pushVLen)//压入栈还没有找完 { for(j=m;j<pushVLen;j++) { if(pushV[j]==popV[i])//相等,停止 break; else stack[top++]=pushV[j];//不等,入栈 } } else//压入栈已经找完了 return false; if(j==pushVLen)//压入栈从m开始找到最后一个都没有找到和popV[i]相等的,返回false return false; else//在压入栈里找到了和popV[i]相等的 m=j+1; } } return true; // write code here }