描述
有1、2、3、4、5、6、7这7个数字依次全部入栈后再出栈,在入栈的过程中栈中的数据也可以随时出栈,一直到整个栈为空。将出栈得到的数字依次排列,就可以得到一个“合法”的序列;对应的,有些形式的排列是无论如何调整入栈和出栈顺序也无法得到的,被称为“非法”序列。
比如:“1 2 3 4 6 7 5” 和“1 2 5 6 4 3 7”都是合法的序列,而“1 2 5 7 3 4 6”和“1 2 6 3 4 5 7”以及“1 2 6 3 5 4 7”都是非法的序列。
请编写程序,判断给定的由7个数字组成的序列是合法的还是非法的,如果是合法的输出“Y”,否则输出“N”。
格式
输入格式
第1行是一个整数n,表示要判断的序列的数目。
从第2行到第n+1行,每行一个序列,由1~7组成输出格式
输出
为一行,一个由“Y”和“N”组成的长度为n的字符串,中间不要空格
本题需要去判断一组数据出栈的合法性。那我们应该先从合法性入手,看看怎么样的顺序算是合法?
出栈的顺序遵循着一个规律:对于数据中第i个数来说,其后的数比它小的必须以递减顺序排列。
举个例子,1 2 5 7 3 4 6(题中为不合法),第三个数5的后面,3 4(比5小)没按递减顺序排列。
样例
输入样例
5 1 2 6 3 5 7 4 1 2 6 5 3 7 4 1 2 7 4 5 6 3 1 2 7 6 3 4 5 1 3 2 4 5 7 6输出样例
NNNNY
故代码为:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
int main() {
int arr[10], brr[10];
char ch[10005];
int n, count = 0, jsq;
scanf("%d", &n);
int m = n;
while (n--) {
for (int i = 1; i <= 7; i++) {
scanf("%d", &arr[i]);
}
int max;
int flag = 1;//标记,合法为1,不合法为0
for (int i = 1; i < 7; i++) {
max = arr[i];
jsq = 1;
for (int j = i + 1; j <= 7; j++) {
if (arr[i] > arr[j] && arr[j] != max) {
brr[jsq] = arr[j];//拿brr数组来存第i个数后面比arr[i]小的数
jsq++;
}
}
//判断是否brr为递减数组:
for (int k = 1; k < jsq - 1; k++) {
for (int t = k + 1; t <= jsq - 1; t++) {
if (brr[t] > brr[k]) {
flag = 0;//不合法为0,跳出循环
break;
}
}
}
}
count++;
if (flag == 0) ch[count] = 'N';
else ch[count] = 'Y';
}
for (int i = 1; i <= m; i++) {
printf("%c", ch[i]);
}
return 0;
}
该题因为数据范围较小,所以该写法不会超时,wo是fw懒汉,所以没怎么去优化,有兴趣的可以去试试优化。