小学生玩ACM----栈和队列

很多人都看过栈和队列了吧?那岂不是我没有说的意义了?那好,我就做这个记录,等我老了还可以给孙子学栈和队列,嘿嘿

     栈和队列一个先进后出,一个先进先出,栈就是一个狗洞,你爬进去之后因为空间太小不许你翻身,所以想出来就的往后挪,当然要是有人用棍子顶住你菊花那你就出不去了,嘿嘿,队列就是你人品好一点,找到的这个狗洞的主人比较勤快,已经把洞挖通了,所以对面就是出口,但是你一进去之后狗狗就发现你了,跟狗抢洞,你不是找抽么?难道这时你还想你能往后挪?所以就拼命往前冲,神马算法啊,先一边去,保住菊花再说,这回先进后出跟先进先出你该有印象了吧?还没印象的话那我这流氓式教育还真是失败

     栈和队列可以是使用STL里面的,也可以自己用数组模拟,根据具体功能,叫你模拟出一个栈或者队列,NTM别说你不行,是男人就不能说不行,那就跳过模拟了咯,直接介绍STL里面的,在STL里面有栈和队列,我是这样理解的,他们就是容器,和int一样,你能用int定义整形变量,我就能用stack和queue来定义栈和队列,然后你就想象有这么个空间,他的名字就是栈或者队列,然后对他的操作就只能是STL里面的那几个固定的函数,发现那句经典台词了没?自己想象有这么个东西,然后吃透各个函数的意义,那栈和队列还不被你搞死搞残啊?函数一共也就11个,当然我这里是介绍的基础的咯,队列还有双向队列和优先队列,这里先不讲,为什么?难道你硬要我告诉你我还不会?擦,那你大大滴不行啊!

     我就先把函数都放这里咯,省得神经兮兮的人还要去找度娘的麻烦

     栈:#include<stack>这个是定义的头文件,懂?

             stack<INT> s;我定义一个INT类型的栈s,INT是随你的,你想栈里面装int就写int,double就写double,最好的一点,嘿嘿,还可以是结构体哦~~

             s.empty()判断栈是否是空的,是空的就返回真,不然就是假,所以这个是常常用在if和while里面应该不用我说吧?

             s.top()返回栈顶元素,你要写a=s.top()的话那么a就被赋值成栈顶元素了,懂?记住,只是返回,但不改变栈里面的内容,也就是没有删除栈顶元素

             s.pop()刚刚说了不会删除,现在这个就是用来删除栈顶元素的,没有返回值,就直接单个单个的用就是了,不过可别对空栈用的,里面本来就没东西,你还要从里面丢出点东西来,NTM是不是成心的咯?

             s.size()返回栈里面有多少元素,就是用来确定栈里面的元素数量的,要是我要求你不许 在栈里面放5个以上的元素,那你是不是就会用上他了咯?不过貌似也不用,嘿嘿,进栈就直接记录好了

             s.push()进栈的函数啊,比如我要a进栈,我就直接写s.push(a);你懂用法了?不懂?NTM去死好不?

     队列:#include <queue>这个是队列定义的头文件

             queue<INT> q;这里的INT和栈一样的,别说需要我来给你讲解,自己看前面

             q.empty();   q.pop();   q.size();   q.push();这些都是和栈一样的用法,别浪费表情~

             q.back();   q.front();这两个是队列的的返回方式,这就是队列有6个函数而栈只有5个的原因,小子,学过English木有?back是后front是前,我翻译的没错吧?错了也不管了,记住,back是返回的队尾的元素,front是返回的队首的元素,用法和栈里面那个top一样,但是为什么队列不同top呢?我当时也纳闷,不过啊,嘿嘿,我提前告诉你,优先队列把他强奸了,所以top就是他的人了,top在优先队列里面用来返回优先级最高的元素,我没学,所以不多少,免得别人说我关公背后玩小刀

      我的站和队列就over了列?还没懂?往左边看咯,是不是木有门?对了,再讲一遍----no door(自己合成的此,不知道语法对不^^!)

      举个例子?

      丫的好险好险,还好上传了一个,不然还的临时敲代码

      栈:

愚人节的礼物

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3347    Accepted Submission(s): 2047


Problem Description
四月一日快到了,Vayko想了个愚人的好办法——送礼物。嘿嘿,不要想的太好,这礼物可没那么简单,Vayko为了愚人,准备了一堆盒子,其中有一个盒子里面装了礼物。盒子里面可以再放零个或者多个盒子。假设放礼物的盒子里不再放其他盒子。

用()表示一个盒子,B表示礼物,Vayko想让你帮她算出愚人指数,即最少需要拆多少个盒子才能拿到礼物。
 


 

Input
本题目包含多组测试,请处理到文件结束。
每组测试包含一个长度不大于1000,只包含'(',')'和'B'三种字符的字符串,代表Vayko设计的礼物透视图。
你可以假设,每个透视图画的都是合法的。
 


 

Output
对于每组测试,请在一行里面输出愚人指数。
 


 

Sample Input
   
   
((((B)()))()) (B)
 


 

Sample Output
   
   
4 1

 

    #include <iostream>  
    #include <cstring>  
    #include <stack> //我是想练习队列和栈来做它,这个题队列和栈一样可以做  
    using namespace std;  
    stack<int> s;  
    int main (void)  
    {  
     int i,j,k,l;  
     char a[1111];  
     while(cin>>a)  
     {  
      l=strlen(a);  
      for(i=0;i<l;i++)  
      if(a[i]=='(')  
       s.push(1); //是左括号就进栈一个1  
      else if(a[i]==')')  
       s.pop(); //是右括号就出栈一个  
      else break;  //不是括号就可以结束了  
      i=0;  
      while(!s.empty()) //栈内是否为空  
      i++,s.pop();  //记录数加一个,出栈一个  
      cout<<i<<endl;  
     }  
     return 0;  
    }  

          妹妹的贴过来的就是丑啊,还是黑白电视机,我还以为我穿越回到解放前了咯!

          队列:

士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2567    Accepted Submission(s): 1160


Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
 


 

Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
 


 

Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
 


 

Sample Input
   
   
2 20 40
 


 

Sample Output
   
   
1 7 19 1 19 37

 

    #include <iostream>  
    #include <queue>  
    using namespace std;  
    queue<int> s;  
    void cmp(int k)  
    {  
     int i=1;  
     while(s.front()!=0)  
     {   
      if(i%k!=0) //把留下来的方队尾  
       s.push(s.front());  
      s.pop();i++; //去掉队首  
     }s.pop();s.push(0); //把队首的0去掉,在队尾加上0  
    }  
    int main (void)  
    {  
     int t,n,i,j,k,l;  
     cin>>t;  
     while(t--&&cin>>n)  
     {  
      for(i=1;i<=n;i++)  
       s.push(i);s.push(0); //每次在屁股加上个0  
      i=1;  
      while(s.size()>4) //因为加上了0,所以长度小于等于4就退出  
      {  
       if(i%2==0)cmp(3); //选择数三下踢一个人还是数两下踢一个人  
       else cmp(2);  
       i++;  
      }i=0;  
      while(!s.empty()) //查看队列中是不是为空  
      {  
       if(s.front()>0) //因为队尾还有个0,这个是不用输出的但是为了清空队列,还是要pop他  
       {  
        if(i)cout<<" ";i=1;  
        cout<<s.front();  
       }  
       s.pop();  
      }cout<<endl;  
     }  
     return 0;  
    }  

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值