数据结构实验之栈与队列七:出栈序列判定 SDUT3334

数据结构实验之栈与队列七:出栈序列判定 
Time Limit: 30 ms Memory Limit: 1000 KiB

Problem Description 
给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次。输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序列。

例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个出栈序列,但4,3,5,1,2就不可能是该序列的出栈序列。假设压入栈的所有数字均不相等。

Input 
第一行输入整数n(1<=n<=10000),表示序列的长度。

第二行输入n个整数,表示栈的压入顺序。

第三行输入整数t(1<=t<=10)。

后面依次输入t行,每行n个整数,表示要判断的每一个出栈序列。

Output 
对应每个测试案例输出一行,如果由初始入栈序列可以得到该出栈序列,则输出yes,否则输出no。

Sample Input 

1 2 3 4 5 

4 5 3 2 1 
4 3 5 1 2 
Sample Output 
yes 
no 
Hint 
Source

THINK: 
模拟入栈和出栈,先把数都存到一个数组里面,输入要出栈的数,与当前的栈顶元素比较,如果不相等说明当前的元素不要出栈,那就继续把数组里面的数入栈,如果遇到相等的了,就说明这个数刚入栈就要出栈,那就出栈;最后看看栈里面还剩不剩元素,输出yes或者no

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[10001],b[10001];
int main()
{
    int n,m;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    scanf("%d",&m);
    while(m--)
    {
        int top=0,p=1;
        for(int i=1;i<=n;i++)
        {
            int k;
            scanf("%d",&k);
            while(b[top]!=k||top==0)
            {
                if(p>n)break;
                b[++top]=a[p++];
            }
            if(b[top]==k)top--;
        }
        if(top==0)printf("yes\n");
        else printf("no\n");
    }
    return 0;
}
  1. #include <bits/stdc++.h>
    using namespace std;
     
    int a[10010], b[10010];//原序列,新序列
     
    int main()
    {
        int n, k;
        cin >> n;
        for(int i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
        }
     
        cin >> k;
        while(k --)
        {
            for(int i = 0; i < n; i++)
            {
                scanf("%d", &b[i]);
            }
            stack<int>S;//中间栈
            int i = 0, j = 0;
            while(j < n)
            {
                if(a[i] == b[j])
                {
                    j++;
                    i++;
                }
                else if(!S.empty() && S.top() == b[j])//取栈顶元素和当前元素想比,若相等,将栈顶元素出栈
                {
                    j++;//新序列元素更新
                    S.pop();
                }
                else if(i < n)
                {
                    S.push(a[i]);//原序列入栈
                    i ++;
                }
           else break;
             }
            if(S.empty())//若中间栈为空,则此序列合法
            {
                cout << "yes" << endl;
            }
            else//否则不合法
            {
                cout << "no" << endl;
            }
        }
        return 0;
    }
     


     
    假设原序列为12345,新序列为54321;                           假设原序列为12345,新序列为43512; 
    原序列全部入栈;                                           前面几项均不匹配
    栈中元素:12345,栈顶元素5,新序列元素5;                       则1234入栈,栈中元素:1234,栈顶元素4,新序列元素4
    栈中元素:1234,栈顶元素4,新序列元素4;                        栈中元素:123,栈顶元素3,新序列元素3                          
    栈中元素:123,栈顶元素3,新序列元素3;                         栈中元素:125,栈顶元素5,新序列元素5
    栈中元素:12,栈顶元素2,新序列元素2;                          栈中元素:12,栈顶元素2,新序列元素1
    栈中元素:1,栈顶元素1,新序列元素1;                           此时,i不再满足条件,跳出循环
    栈空                                                     栈不空
     
     
     
     
     
     
     

    扫描二维码关注公众号,回复: 2573621 查看本文章

猜你喜欢

转载自blog.csdn.net/Allinone99/article/details/81366897