3 条题解

  • 2
    @ 2023-11-29 18:37:11

    课上有原题,所以这里只放核心代码:

    Rep(i, 1, n)
    {
        s.push(a[i]);
        while (s.top() == b[sum])
        {
            s.pop();
            sum++;
            if (s.empty())
                break;
        }
    }
    cout << ((s.empty()) ? "Yes" : "No") << endl;      
    while (!s.empty())
        s.pop();
    
    • 1
      @ 2024-4-5 20:32:50

      真的用栈模拟就好了啊

      从头开始,按入栈顺序入栈,如果栈顶与出栈序列的最前面的数相同,就将其弹出

      最后将所有入栈的数都入栈后,判断栈中剩下的数与出栈序列中剩下的数顺序相同,就按照上面的方式依次弹出,直到无法弹出或栈为空

      如果栈为空,则出栈序列是合法的,输出"Yes",不为空输出"No"

      #include<bits/stdc++.h>
      using namespace std;
      int main()
      {
      	int q;
      	cin>>q;
      	while(q--)
      	{
      		int n;
      		int a[100001],b[100001];
      		stack<int >st;
      		cin>>n;
      		for(int i=1;i<=n;i++)
      		cin>>a[i];
      		for(int i=1;i<=n;i++)
      		cin>>b[i];
      		int head=1;
      		for(int i=1;i<=n;i++)
      		{
      			st.push(a[i]);
      			while(st.top()==b[head])
      			{
      				st.pop();
      				head++;
      				if(st.empty())
      				break;
      			}
      		}
      		if(st.empty())
      		cout<<"Yes"<<endl;
      		else 
      		cout<<"No"<<endl;
      	}
      }
      
    • 0
      @ 2023-11-1 18:09:26

      只需要根据出栈序列,模拟入栈出栈的过程,分析是否满足“后进先出”的特性就好了。 例如: 对于入栈序列 1 2 3 4,判断出栈序列能否是1 4 2 3。 首先按入栈顺序依次入栈,每当栈顶与出栈序列最前面的数相同,就将其出栈,最后如果所有元素都出栈了,说明出栈序列合法,否则不合法。 在这个例子中先将1入栈,此时栈顶元素和出栈序列最前面的数相同,1出栈。接着2、3入栈时,都和出栈序列最前面的数不同,依次入栈即可。之后4入栈,栈顶元素和出栈序列最前面的数相同,4出栈。此时栈顶元素是3,而出栈序列最前面的数是2,无法顺利出栈。总共只出栈了1和4两个元素,说明出栈序列不合法。 换言之,若当前栈顶元素等于下一个出栈序列的元素,则让栈顶元素出栈,否则只能让下一个元素进栈,最终根据出栈元素的个数是否为n来判断出栈序列是否合法。

      #include<bits/stdc++.h>
      using namespace std;
      int a[100005], b[100005], sta[100005];
      int q, top, n, cnt;
      int main(){
          int T;cin>>T;
          while (T--){
      		cin >> n;
      	    for (int i = 1; i <= n; i++)
      	        cin >> a[i];
      	    for (int i = 1; i <= n; i++)
      	        cin >> b[i];
      	    top = 0, cnt = 0;
      	    for (int i = 1; i <= n; i++){
      	        top++;
      	        sta[top] = a[i];
      	        while (top > 0 && sta[top] == b[cnt + 1]){
      	            top--;
      	            cnt++;
      	        }
      	    }
      	    if (cnt == n)
      	        cout << "Yes" << endl;
      	    else
      	        cout << "No" << endl;
          }
      }
      
      
      • 1

      信息

      ID
      534
      时间
      1000ms
      内存
      125MiB
      难度
      6
      标签
      递交数
      259
      已通过
      82
      上传者