判断出栈序列合法性(c语言版)

描述

有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懒汉,所以没怎么去优化,有兴趣的可以去试试优化。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值