用C语言实现回文的判断

首先我们需要知道回文是什么呢?

回文,汉语词语,指汉语中的回文语法,即把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情况,叫做回文,也叫回环。

举个例子

如:日往则月来,月往则日来。 《易经·系辞》

又如:记梦回文二首 宋 苏轼

其一:酡颜玉碗捧纤纤,乱点余花吐碧衫。

歌咽水云凝静院,梦惊松雪落空岩。

其二:

空花落尽酒倾缸,日上山融雪涨江。

红培浅瓯新火活,龙团小碾斗晴窗。

这是两首通体回文诗。又可倒读出下面两首,极为别致。

其三:

岩空落雪松惊梦,院静凝云水咽歌。

衫碧吐花余点乱,纤纤捧碗玉颜酡。

其四:

窗晴斗碾小团龙,活火新瓯浅焙红。

江涨雪融山上日,缸倾酒尽落花空。

下面我们就来尝试用C语言来判断一段字符是否符合这样的规律

首先我们清楚回文是前半段和后半段相同的

那么,我们可以将字符全部入队,通过从队首拿取元素,与队尾指针指向元素进行比较,每次比较后队尾指针向前移一位即可

下面我们具体看看如何操作

我们先写出主函数,再逐步补全

int main() {
    char str[MAX_SIZE];
    printf("请输入一个字符串:");
    scanf("%s", str); // 使用 scanf 读取字符串

    if (pdhw(str)) {
        printf("%s 是回文。\n", str);
    } else {
        printf("%s 不是回文。\n", str);
    }

    return 0;
}

从其中我们可以看出需要函数“pdhw”

int pdhw(char* str) {
    int l = strlen(str);
    Queue queue;
    initQueue(&queue);  // 初始化队列

    for (int i = 0; i < l; i++) {
        enqueue(&queue, str[i]);
    }
    //字符串入队



    // 将队首和队尾的元素依次比较
    while (queue.front <= queue.rear) {
        char frontChar = dequeue(&queue);
        char rearChar = queue.data[queue.rear];
        if (frontChar != rearChar) {
            return 0;  // 若不相等,则不是回文
        }
        queue.rear--;  // 更新队尾指针
    }

    return 1;  // 所有字符都相等,是回文
}
//判断是否是回文

最后我们看看所有函数补全后的代码

#include <stdio.h>
#include <string.h>

#define MAX_SIZE 100

typedef struct {
    char data[MAX_SIZE];//最大容量为MAX——SIZE
    int front;
    int rear;
} Queue;
//定义队列结构

void initQueue(Queue* queue) {
    queue->front = 0;  // 队首指针为0
    queue->rear = -1;  // 队尾指针为-1
}
//创建一个队列

void enqueue(Queue* queue, char a) {
    if (queue->rear == MAX_SIZE - 1) {
        printf("队列已满,无法入队。\n");
        return;
    }
    queue->data[++(queue->rear)] = a;  // 将元素入队,并更新队尾指针 queue->rear先找到rear的位置,然后先自增再插入a,即入队
}
//入队
char dequeue(Queue* queue) {
    if (queue->front > queue->rear) {
        printf("队列为空,无法出队。\n");
        return '\0';
    }
    return queue->data[(queue->front)++];  // 出队并返回出队的元素,同时更新队首指针
}
//元素出队

int pdhw(char* str) {
    int l = strlen(str);
    Queue queue;
    initQueue(&queue);  // 初始化队列

    for (int i = 0; i < l; i++) {
        enqueue(&queue, str[i]);
    }
    //字符串入队



    // 将队首和队尾的元素依次比较
    while (queue.front <= queue.rear) {
        char frontChar = dequeue(&queue);
        char rearChar = queue.data[queue.rear];
        if (frontChar != rearChar) {
            return 0;  // 若不相等,则不是回文
        }
        queue.rear--;  // 更新队尾指针
    }

    return 1;  // 所有字符都相等,是回文
}
//判断是否是回文

int main() {
    char str[MAX_SIZE];
    printf("请输入一个字符串:");
    scanf("%s", str); // 使用 scanf 读取字符串

    if (pdhw(str)) {
        printf("%s 是回文。\n", str);
    } else {
        printf("%s 不是回文。\n", str);
    }

    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值