1 条题解

  • 0
    @ 2026-1-28 13:05:22
    #include <bits/stdc++.h>
    using namespace std;
    
    // [1] arr数组-存储每组测试用例的出栈序列,最多支持200个元素(适配n≤100的数据范围)
    int arr[200];
    
    int main() {
        // [2] t-测试用例的组数(m≤30)
        int t;
    	cin>>t;
        // [3] 处理每组测试用例
    	while(t--){
            // [4] n-当前测试用例的出栈序列长度(1≤n≤100)
    		int  n;
    		cin>>n;
            // [5] s-模拟入栈和出栈的栈
    		stack<int> s;
            // [6] 读取当前测试用例的出栈序列,存入arr数组
    		for(int i=0;i<n;i++)	cin>>arr[i];
            // [7] flag-标记出栈序列是否合法(1=合法,0=不合法);j-当前待入栈的元素(初始为1,因为入栈顺序是1,2,...,n)
    		int flag=1,j=1;
            // [8] 遍历出栈序列的每个元素,模拟入栈和出栈过程
    		for(int i=0;i<n;i++){
                // [9] 入栈逻辑:将所有小于等于当前出栈元素arr[i]的元素入栈(因为入栈顺序是递增的,必须先入栈1到arr[i],才能让arr[i]在栈顶)
    			while(arr[i]>=j){
    				s.push(j++);
    			}
    			
                // [10] 检查栈顶是否等于当前出栈元素:如果是,说明可以合法出栈,弹出栈顶;否则序列不合法
    			if(s.top() == arr[i]){
    				s.pop();
    			}else{
    				flag=0;
    				cout<<"No"<<endl;
    				break;
    			}
    		}
            // [11] 如果所有元素都合法出栈,输出Yes
    		if(flag==1) cout<<"Yes"<<endl;	
    	} 
        return 0;
    }
    
    • 1

    信息

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