1 条题解

  • 0
    @ 2025-4-7 22:24:29

    题意:注意 题目给出的顺序是出栈顺序 1.我门这道题其实就是要判断,出栈顺序是否合理? 2.中间站看作是一个stack (现进后出 后进先出的特点) 3.他强调车厢分裂 是想要告诉我们 一辆车可以立刻进立刻出,可一旦进入之后不出来 就要等到在栈位置中的上一辆车出去才可以出去 4.因为这个上面这个特点,所以才会有两个正确的出栈顺序12345(每一辆车立刻进了立刻出)和654321(所有车不出等到最后一起出) 5.特别强调:车的入栈顺序 永远都是123456…n 6.其次呢 stack的基本操作:pop pushback empty 7.最后呢 注意输入输出问题

    解题思路

    栈模拟:使用栈来模拟压入和弹出操作。 顺序验证:依次将数字压入栈中,并检查栈顶是否与目标序列的当前元素匹配。 每个样例一行输入,第一个数代表底数第二个数是系数,以此类推,读到换行符结束,问这行样例最后组成的数字的值减一,将其质因数从大到小输出。跑一边埃氏筛选法筛选出素数,然后再把读入的样例转换为数值后就可以分解了。

    代码分析

    输入处理: 读取输入的整数 n,表示序列的长度。 读取 n 个整数,存储在数组 a 中。 栈操作: 使用栈 s 来模拟压入和弹出操作。 依次将数字压入栈中,每次压入后检查栈顶是否与目标序列的当前元素匹配。 如果匹配,则弹出栈顶元素,并继续检查下一个目标元素。 结果判断: 如果所有目标元素都能匹配,则输出 "Yes"。 否则,输出 "No"。

    原理

    栈的特性:栈是后进先出(LIFO)的数据结构,每次只能操作栈顶元素。 顺序验证:通过模拟压入和弹出操作,验证目标序列是否符合栈的出栈顺序。

    实现步骤

    读取输入: 读取整数 n,表示序列的长度。 读取 n 个整数,存储在数组 a 中。 栈初始化: 初始化一个空栈 s。 模拟操作: 依次将数字压入栈中。 每次压入后,检查栈顶是否与目标序列的当前元素匹配。 如果匹配,则弹出栈顶元素,并继续检查下一个目标元素。 结果输出: 如果所有目标元素都能匹配,则输出 "Yes"。 否则,输出 "No"。

    #include<bits/stdc++.h>
    #include<stack>
    const int N = 1010;
    int n;
    int a[N];
    using namespace std;
    int main()
    {
    	while (scanf("%d", &n) && n != 0)
    	{
    		while (true)
    		{
    			int k; scanf("%d", &k);
    			if (k == 0)break;
    			else a[0] = k;
    			for (int i = 1; i < n; i++)
    			{
    				scanf("%d", &a[i]);
    			}
    			int x = 0;
    			stack<int>s;
    			for (int i = 0; i < n; i++)
    			{
    				s.push(i + 1);
    				while (!s.empty() && s.top() == a[x])
    				{
    					s.pop();
    					x++;
    				}
    			}
    			if (x == n)printf("Yes\n");
    			else printf("No\n");
    		}
    		printf("\n");//也同时意味着进入下一个关于n辆车出栈顺序的测试
    	}
    	printf("\n");
    }
    • 1

    信息

    ID
    364
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    1
    上传者