中国大学MOOC-陈越、何钦铭-数据结构-2017秋 02-线性结构4 Pop Sequence
分析:
因pop 时,需要检查栈顶 是否和 要求匹配,
No:
1、如不匹配 则push 元素,当元素都push完仍不匹配,则 输出no
Yes:
当元素匹配完毕后 输出yes
因自己看,,所以参数命名很别扭,表示并不想改了…
#include <stdio.h>
#include <stdlib.h>
struct Stack{
int size;
int maxNum;
int checkNum;
}stack;
void checkFun(struct Stack stack,int numStack[],int list[][stack.maxNum]);
int main(){
scanf("%d %d %d",&stack.size,&stack.maxNum,&stack.checkNum);
int numStack[stack.size];
int list[stack.checkNum][stack.maxNum];
int i,j;
for(i=0;i<stack.checkNum;i++){
for(j=0;j<stack.maxNum;j++)
{
scanf("%d",&list[i][j]);
}
}
checkFun(stack,numStack,list);
}
void checkFun(struct Stack stack,int numStack[],int list[][stack.maxNum]){
int i;
// for(i=0;i<stack.checkNum;i++){
// for(j=0;j<stack.maxNum;j++)
// {
// printf("%d",list[i][j]);
// }
// }
int topStack=-1;
int checkNum=0;
int popNum=1;
for(i=0;i<stack.checkNum;i++)
{
while(1){
// printf("%d %d %d\n",topStack,popNum,checkNum);
if(checkNum==stack.maxNum)
{ printf("YES\n"),topStack=-1,popNum=1,checkNum=0;break;}
//成功
if(topStack==-1)topStack++,numStack[topStack] = popNum,popNum++;
if(numStack[topStack]==list[i][checkNum])checkNum++,topStack--;
//相等的情况,pop出元素,检查下一个元素。
else{
if(topStack==stack.size-1){printf("NO\n"),topStack=-1,popNum=1,checkNum=0;break;}
//stack满,且stack top 与 check num 不相等。
if(popNum==stack.maxNum+1){printf("NO\n"),topStack=-1,popNum=1,checkNum=0;break;}
//元素push尽,失败
topStack++,numStack[topStack] = popNum,popNum++;
}
//不相等的情况,push元素,继续检查
}
}
}