zoukankan      html  css  js  c++  java
  • 啊哈!算法: 解密回文

    原书中读取字符串使用了gets(),使用此函数读取字符串很危险,因此改用了fgets()替代,修改后代码如下:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int main(void)
     5 {
     6     char str[100], stack[100];
     7     int  i, len, mid, next, top;
     8 
     9     fgets(str, sizeof(str), stdin);
    10     len = strlen(str);//including '
    '
    11     mid = len / 2 - 1;//求字符串的中点
    12 
    13     top = 0;//初始化栈
    14     for (i = 0; i <= mid; i++){//将mid前的字符依次压入堆栈
    15         stack[++top] = str[i];
    16     }
    17 
    18     //判断字符串长度是奇数还是偶数,以决定需要匹配的后半部分起始下标
    19     next = (len % 2) ? (mid+2) : (mid+1);
    20 
    21     //开始匹配
    22     for (i = next; i <= len - 1; i++){
    23         if (str[i] != stack[top]) break;
    24         top--;
    25     }
    26 
    27     //验证结果
    28     if (top == 0)
    29         printf("YES
    ");
    30     else
    31         printf("No
    ");
    32 
    33     return 0;
    34 }

    gets()与fgets()之间的区别,请参看我的另一篇文章《字符串读取引申的问题》,只是要注意的是输入字符串请采用重定向哦,如果手工输入再回车会导致strlen()返回的长度比实际长度大1,原因是多读入了一个换行符。

          当然,也没必要非要把这个问题搞这么复杂,因为字符串存储在一个字符数组中,在知道字符串长度的情况下,我们完全可以通过两个指针,一个指向第一个字符,另一个指向最后一个字符,比较两者是否相等。如果相等,两个指针就同时向中间移动一个元素,进行下一轮比较;如果不等,则比较结束,表示该字符串不是回文字符串;如果直到指针移动到中间位置任然不存在不相等的情况,则表示该字符串是回文字符串。代码如下:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int isHuiWen(char s[], int len){
     5     int i, mid = len / 2;//遍历到mid之前的元素停止
     6 
     7     for (i = 0; i < mid; i++){
     8         if (s[i] == s[len - i - 1])continue;
     9         else return 0;
    10     }
    11     return 1;
    12 }
    13 
    14 int main(void)
    15 {
    16     char str[100];
    17     int  len;
    18 
    19     fgets(str, sizeof(str), stdin);
    20     len = strlen(str);
    21     printf("%s of size %d
    ", str, len);
    22 
    23     if (isHuiWen(str, len)){
    24         printf("YES
    ");
    25     }else{
    26         printf("No
    ");
    27     }
    28 
    29     return 0;
    30 }
  • 相关阅读:
    Python shutil模块
    Flask 上传文件
    Flask DBUtils
    flash-session
    Flash 上下文管理
    python 栈
    python 偏函数
    threding.local
    next() 与 nextLine() 区别
    Thread.sleep(1000*3); // 休眠3秒
  • 原文地址:https://www.cnblogs.com/xiaomanon/p/4466432.html
Copyright © 2011-2022 走看看