学习数据结构的第五天wwww

俗话说得好,只看理解其意,不如自己做题。我们只有自己理解后加以运用知识才会属于我们自己。就拿今天的测试来讲吧。(原先想讲点别的的,但觉得自己可能未完全搞懂,就先讲这个吧)

题目描述

给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 �(�≤100000)n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。为了防止骗分,每个测试点有多组数据。

输入格式

第一行一个整数 �q,询问次数。

接下来 �q 个询问,对于每个询问:

第一行一个整数 �n 表示序列长度;

第二行 �n 个整数表示入栈序列;

第三行 �n 个整数表示出栈序列;

输出格式

对于每个询问输出答案。

咋一看好像很简单,实际上不是。我开始是干的什么,直接就栈进栈出,像个呆瓜一样还在那里问为什么,搞了半天,我发现一丝不对劲了。首先是那个“为了防止骗分”是什么意思,如果一个简单的题目会写这种东西吗?那么真相只有一个,这道题还有更深层次的问题在其中。后面仔细一看,额?是不是出栈可以一下一下出呢?就是2143也是符合的这种方式的。其实题目也很明显了,它用的可能,全都怪我,没有仔细去看题。白白浪费了半个小时。那么明白了题意的思路又是怎样的呢?首先,既然要用栈来解决这个问题,还要出栈,那么就避免不了要用到中间数组。

#include <stdio.h>
#include <stdlib.h>
int arr[100002];
int brr[100002];
int crr[100002];//上面讲了
int main()
{
    int a,b=0,n,i;
    scanf("%d",&a);//循环次数
    while(a>0)
    {
        scanf("%d",&n);
        for(b=0;b<n;b++)
        {
            scanf("%d",&arr[b]);
        }
        for(b=0;b<n;b++)
        {
            scanf("%d",&brr[b]);
        }//输入进两数组里面
         int c = 0, d = 0;
        for(i = 0; i < n; i++) {
            crr[d] = arr[i];
            while(brr[c] == crr[d] && d > -1 && c != n)
            {
                d--;
                c++;
            }//出栈操作,找到和arr数组中相同的“头”,没找到就下一位,找到了之后呢就踢出去,直到踢完。
            d++;
        }
        if(d==0)这个如果踢完了就是0,没踢完就啥也不是
        printf("Yes\n");
        else
        printf("No\n");

        a--;
    }
    return 0;
}

再讲一下被EX的一道题目

假设一个表达式有英文字母(小写)、运算符(+、-、*、/)和左右小(圆)括号构成,以 @ 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES;否则输出 NO。表达式长度小于 
255
255,左圆括号少于 
20
20 个。

输入格式
一行:表达式。

输出格式
一行:YES 或 NO。

一眼看去,哇塞,白给的题目( •̀ ω •́ )y,哈哈哈,一检查,Unaccepted。这就告诉我,鼻子上面长两蛋,不要只会眨吧不会看。)))(((@是不可取的。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char arr[260];
    int a,b=0;
    scanf("%s",arr);
    while(arr[a]!='\0')
    {
       if(arr[a]=='(')
       {
           b=b+1;
       }
       if(arr[a]==')')
       {
           b=b-1;
       }//输入没啥的
       if(b<0)
       {
           break;
       }//这才是重点,因为没有哪家的括号是))((这样长的,就是这个我还自我怀疑了半天
       a++;

    }
    if(b==0)
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0;
}

这么些题目下来,我终于知道,不能太单纯,不然会吃大亏。好了,天色渐晚,今天就到这了。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值