判断回文的三种方式

首先,先介绍一下什么是回文:


这就是回文,简单来说就是前后对称。

首先,介绍第一种方法:就是将这串数字逆序,然后判断逆序后的数字是否和正序后的数字完全一样,如果完全一样,就是回文。

那么,如何将这串数字逆序:就是利用一个栈来实现逆序。  利用栈先进后出的性质。


代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[9999];
int n;
stack < int > q;//定义一个栈结构  让整个数组逆序输出
class heat
{
public:
    void ruzhan()//入栈操作,利用栈的先进后出的特性,可以使用户给定的一串数字逆序输出
    {
        int i=0;
        for(i=0;i<n;i++)
            q.push(a[i]);
    }
public:
    bool hexin()//核心代码:利用回文结构的性质,一串数字(字符串)正序和逆序完全一样,就说明是回文结构
    {
        for(int i=0;i<n;i++)
        {
           if(a[i]!=q.top())//正常访问数组是正序,通过栈访问是逆序,只要正序和逆序有一个数字不同,直接返回false
                return false;
           q.pop();
        }
        return true;//全部一样  返回true
    }
};
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    heat p;
    p.ruzhan();
    cout<<p.hexin()<<endl;

}

第二种方法:

只把数组后半部分利用栈结构进行逆序,然后和数组前半部分进行对比,如果全部相等,就证明是回文序列,否则,就不是回文序列。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[9999];
int n;
int fast=0;//快指针 每次走两步
int slow=0;//慢指针  每次走一步   当快指针走完后,慢指针正好到数组中点位置
stack < int > q;//定义一个栈结构,让数组后半部分逆序输出
class heat
{
public:
    void fastandslow()//这个函数是用来让快满指针在数组上走动的,最终确定好慢指针指向的数组的位置
    {                 //注意,当数的个数是偶数时,我们要求慢指针最后停在中间两个数中的前一个
        while(fast+2<n)
        {
            slow+=1;
            fast+=2;
        }
    }
public:
    void ruzhan()//将数组后半部分的数字入栈,目的上让这些数字逆序输出
    {
            for(int i=slow+1;i<n;i++)
                q.push(a[i]);
    }
public:
    bool hexin()//核心代码:利用回文结构的性质,一串数字(字符串)前半部分数字正序和后半部分逆序完全一样,就说明是回文结构
    {              
        if(slow==n/2)//如果数字总个数是奇数,就执行下面代码
        {
            for(int i=0;i<slow;i++)
            {
                if(a[i]!=q.top())//正常访问数组是正序,通过栈访问是逆序,只要正序和逆序有一个数字不同,直接返回false
                    return false;
               q.pop();
            }
            return true;//全部一样  返回true
        }
        else//如果数字个数为奇数,就执行下面代码
        {
            for(int i=0;i<=slow;i++)
            {
                if(a[i]!=q.top())//正常访问数组是正序,通过栈访问是逆序,只要正序和逆序有一个数字不同,直接返回false
                    return false;
               q.pop();
            }
            return true;//全部一样  返回true
        }
    }
};
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    heat p;
    p.fastandslow();
    p.ruzhan();
    cout<<p.hexin()<<endl;

}

第三种放法和第二种类似,只不过第三种方法不需要运用栈来实现逆序,直接在数组中逆序。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[9999];
int n;
int fast=0;//快指针 每次走两步
int slow=0;//慢指针  每次走一步   当快指针走完后,慢指针正好到数组中点位置
void swap(int i,int j)//交换函数
{
    int temp=a[i];
    a[i]=a[j];
    a[j]=temp;
}
class heat
{
public:
    void fastandslow()//这个函数是用来让快满指针在数组上走动的,最终确定好慢指针指向的数组的位置
    {                 //注意,当数的个数是偶数时,我们要求慢指针最后停在中间两个数中的前一个
        while(fast+2<n)
        {
            slow+=1;
            fast+=2;
        }
    }
public:
    void hounixu()//通过fastandslow()函数,slow已经指向了数组的中间位置,此时需要让slow位置后面的数逆序,然后判断逆序后的数和slow前面的数是否相等。
    {             //如果相等,那么说明是回文,否则不是回文
        int frist=slow+1;//frist指向的slow位置后面第一个位置上的数
        int end=n-1;//end指向的是数组的最后一个数
        while (frist<end)//让frist++和end--来交换数组上的数来实现逆序
        {
            swap(frist,end);
            end-=1;
            frist+=1;
        }
    }
public:
    bool hexin()
    {
        if(slow==n/2)//如果数字总个数是奇数,就执行下面代码
        {
            for(int i=0,j=slow+1;i<slow;i++,j++)
                if(a[i]!=a[j])//slow位置前面的数是正序访问,slow位置后面的数是逆序访问,只要正序和逆序有一个数字不同,直接返回false
                    return false;
            return true;//全部一样  返回true
        }
        else//如果数字个数为奇数,就执行下面代码
        {
            for(int i=0,j=slow+1;i<=slow;i++,j++)
                if(a[i]!=a[j])//slow位置前面的数是正序访问,slow位置后面的数是逆序访问,只要正序和逆序有一个数字不同,直接返回false
                    return false;
            return true;//全部一样  返回true
        }
    }
};
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    heat p;
    p.fastandslow();
    p.hounixu();
    cout<<p.hexin()<<endl;
}

猜你喜欢

转载自blog.csdn.net/qq_40938077/article/details/80213789