啊哈!算法: 解密回文

原书中读取字符串使用了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 }
原文地址:https://www.cnblogs.com/xiaomanon/p/4466432.html