判断回文串------分别用c语言和c++两种方法解决

分别用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;
}

小白作者声明:以上仅供参考使用,如有问题和见解,可以评论留言。
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值