题目要求:
给定样例:
做题思路:
本题思想是手动模拟出栈的过程,看看最后是否合法:假设有最开始入栈序列,给你一个出栈序列,有以下几种情况:
1)栈为空,入栈序列不为空,则入栈,入栈序列-1,堆栈长度+1;
2)栈顶元素与出栈元素相等,出栈,出栈元素往后移,堆栈长度-1;
3)栈顶元素与出栈元素不相等,如果入栈序列不为空,则再入栈,入栈序列-1,堆栈长度+1;
循环上面三个过程,如果同时满足堆栈为空,入栈序列,出栈序列都处理完了,则说明给定的出栈序列合法。
注意!!!如果堆栈最大长度有要求的话,要在循环里面判断会不会超过,还有出栈入栈也不能超过给定的长度。
代码实现:
#include<stdio.h>
int isyes(int *a, int n,int m)//a是要判断的出栈序列,n是序列长度,m是堆栈的最大长度
{
int b[1000];
int c[1000];//模仿堆栈
for (int i = 0; i < n; i++)
b[i] = i + 1;//1,2,3,4....//要入栈的序列
int i1=0;//记录入栈序列
int l2=0;//记录堆栈里面的长度
c[l2++]=b[i1++];//第一个入栈
int i=0;//记录出栈序列
while(l2||i<n||i1<n)//如果堆栈为空,且都处理到头了
{
if(l2==0){//堆栈为空
c[l2++]=b[i1++];
}
if(a[i]==c[l2-1])//如果相同
{
i++;//往后移一位
l2--;//出栈,堆栈长度-1
}
else {
c[l2++]=b[i1++];//入栈
}
if(i>n||i1>n||l2>m)return 0;//如果堆栈长度超过最大长度,要入栈,要出栈的位置不合法,都是直接退出
}
return 1;
}
int main() {
int m, k, n;
int a[100][100];//用来记出栈序列
scanf("%d %d %d", &m, &n, &k);
for (int j = 0; j < k; j++) {
for (int i = 0; i < n; i++)
scanf("%d", &a[j][i]);//全部输入
if (isyes(a[j], n,m))printf("YES\n");
else printf("NO\n");
}
}
记录一下我的写题过程哈哈,有更好思路欢迎提出来呀!