您的位置:首页 > 其它

基础篇——队列,栈

2015-09-15 10:29 232 查看
队列与栈
(一)队列
经典例题:一串长为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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: