基础篇——队列,栈

队列与栈
(一)队列
       经典例题:一串长为n加密的数字,解密法则如下——将第一个数删除,再把第二个数放到末尾,删除第三个数,将第四个放到末尾。。。。。。直到剩下最后一个数,将最后一个数删除。按照之前删除的顺序,把这些数连在一起便是 源码。
      例:所给长为9的数串“6  3  1  7  5  8  9  2  4”
              第一步:删6移3——>1  7  5  8  9  2  4  3         6第一个被删,源码6开头
              第二步:删1移7——>5  8  9  2  4  3  7             1第二个被删,1在第二位
              第三步:删5移8——>9  2  4  3  7  8                  5第三个被删,5在第三位
              第四步:删9移2——>4  3  7  8  2                      9在第四位
              第五步:删4移3——>7  8  2  3                           4接2后面
              第六步:删7移8——>2  3  8                                接着是7
              第七步:删2移3——>8  3                                    接着是2
              第八步:删8移3——>3                                         倒数第二位是8
              第九步:删3                                                            末尾为3
              源码:6  1  5  9  4  7  2  8  3

         通常删除一个数后将其他位一次往前挪一位,这样虽节省空间,但太浪费时间。在队列法中我们引入head,tail两个变量,每删除一个数便将head后移一位,每移动一个数便将head和tail都后移一位,移动的数放入tail所对应的单元中,虽然空间会比之前大但大大节省了时间。输入n,之后输入n位数字。
         
                              head                                                    tail
        定义数组q[]     1     2     3    4    5    6    7    8    9    10       初始化head=1,tail=10;
                                   6    3     1    7    5    8    9     2    4
                                               head                                                     tail
                        q[]     1     2      3      4     5     6     7     8     9     10     11   
                                  6    3      1      7      5     8     9     2     4      3
                                                               head                                                 tail
                         q[]     1     2      3      4      5     6     7     8     9      10     11     12
                                  6     3      1      7      5     8     9     2     4      3        7
        以此类推,数组最终为
                        q[]     1   2    3    4    5   6   7   8   9   10   11  12   13   14   15   16   17
                                 6   3    1    7    5    8   9  2   4    3      7    8      2     3     8     3      3  
代码实现:
#include<iostream>
using namespace std;
int main()
{
    int q[200],head,tail,i,n;
    while(cin>>n)
    {
        for(i=1;i<=n;i++)
            cin>>q[i];
        head=1;tail=n+1;
        while(head<tail)
        {
            cout<<q[head++];
            q[tail++]=q[head++];
        }
        cout<<endl;
    }
    return 0;
}

                                                                                                                                                    (二)栈

        栈与队列的区别就是队列为先进先出的数据结构,栈为先进后出的数据结构。好比一个桶里有3个球从下往上依次是2 1  3,现在想将4放入最底下,只能先将3取出然后是1,然后是2。可见最先放进去的被最后拿出,这即是栈的特点。(国二考试的考点~~)
        栈究竟有哪些作用?最主要的就是判断字符串是否为回文字符串。所谓回文字符串指正着读反着读都一样的字符串,如“abcba”,“席主席”等。栈的实现很简单,只需定义一个一维数组或者字符串和一个指向栈顶的变量top即可。
  
        例:给出一个字符串,判断是否是回文字符串。
分析:若字符串回文则它比关于中间对称。第一步读入字符串并求出其中点。
<pre name="code" class="cpp">char a[200];
int mid,len;
gets(a);
len=strlen(a);
mid=len/2-1;
 
 
 
        接下来便该栈出场了。
先将mid之前的字符读入栈,定义用来实现栈的数组char s[200],初始化将top=0。入栈操作即是:
<pre name="code" class="cpp">char s[200];
for(int i=0;i<mid;i++)     
s[top++]=a[i];
           
 关键步骤!!! 
当前字符依次出栈,看是否与mid之后的字符相同,相同则为回文,反之不为。
注意:对比前先判断字符串长度是奇数还是偶数,若为偶数,从mid+1位开始对比,反之从mid+2位开始对比。
<pre name="code" class="cpp">if(len%2==0) mid+=1;
if(len%2==1) mid+=2;
for(int i=mid+1;i<=len-1;i++)
   if(a[i]!=s[top--]) break;
if(top==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;

 完整代码: 
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
    char a[200],s[200];
    int mid,top,len;
    while(cin>>a)
    {
        len=strlen(a);
        mid=len/2-1;
        top=0;
        for(int i=0;i<=mid;i++)
        {
            s[++top]=a[i];
        }
        if(len%2==0) mid+=1;
        if(len%2==1) mid+=2;
        for(int i=mid;i<=len-1;i++)
        {
            if(a[i]!=s[top--]) break;
        }
        if(top==0) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}
Input: ahaha
           ahah
Output:YES
             NO







                              
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值