首先,先介绍一下什么是回文:
这就是回文,简单来说就是前后对称
目录:
第一种方法:
就是将这串数字逆序,然后判断逆序后的数字是否和正序后的数字完全一样,如果完全一样,就是回文。
那么,如何将这串数字逆序:就是利用一个栈来实现逆序。 利用栈先进后出的性质。
代码如下:
#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;
}