分别用c语言和c++判断回文串
题目描述
输入一串字符(长度小于100),判断该串字符是否是回文串(正序读与逆序读内容相同)。
输入
输入一串字符(长度小于100)。
输出
若该串字符是回文串输出“yes",否则输出”no“。
样例输入
asdfgfdsa
样例输出
yes
解题思路:
观察回文串的特点,它正序排列和逆序排列是一样的,所以可以将原字符串进行逆序排列放入一个新的“盒子里”,
然后和原来的字符串进行比较, 比较的方式有多种,可以直接把两个字符串拿去判断是否相等,或者进行做差,
相减看是否为零,还有一种方法就是根据回文串自身“对称”, 将对称位进行比较,完全一样时,也可以证明
是回文串,然后就可以得出结论。
大致方法:
(1)先找两个“盒子”即定义两个字符数组,一个用于装你要判断的字符串,另一个是装逆序后的字符串。
(2)用 gets 或者 scanf 两种方式输入,然后用 for 语句进行逆序。
(3)此时判断字符串大小时要用到函数 strcmp() 若两字符串相等时返回值为 0 。
C语言代码(1):
#include <stdio.h>
#include <string.h>
int main()
{
char s[16],a[16];
gets(s); //输入
int i,n;
n=strlen(s);
int j=0;
i=n-1;
for(j=0;j<n;j++) //逆序
{
a[j]=s[i];
i--;
}
if(strcmp(s,a)==0) //比较
{
printf("yes\n"); //输出
}
else printf("no\n");
return 0;
}
C语言代码(2):
#include <stdio.h>
#include <string.h>
int main()
{
char a[100];
int i,l;
while(scanf("%s",a)!=EOF) //多组输入
{
l=strlen(a); //取字符串长度
for(i=0;i<l/2;i++)
{
if(a[i]!=a[l-i-1]) {printf("no\n");break;} //对称位不等,不是回文,退出循环
}
if(i>=l/2) printf("yes\n"); //对比次数大于字符串长一半,是回文
}
return 0;
}
C++语言代码:
#include<iostream>
#include<string>
#include<cstdlib>
#include<stack>
using namespace std;
int main()
{
string a;
while(1) //可以多组输入
{
cin>>a;
int i,flag=1; //标志位为1
char b;
stack<char> q;
for(i=0;i<a.length();i++)
{
q.push(a[i]); //依次入栈
}
for(i=0;i<a.length();i++)
{
b=q.top(); //取栈顶
if(b!=a[i]) {flag=0;break;} //栈顶与相应位字符不同,非回文,标志位改为0,退出循环
q.pop(); //出栈
}
if(flag) cout<<"Yes"<<endl; //标志位为1,是回文串
else cout<<"No"<<endl; //标志位改变,非回文串
}
return 0;
}