使用C语言检查字符串是否为回文

在编程和算法的世界里,回文字符串是一个常见的话题。回文字符串是指一个字符串正读和倒读都相同,例如“radar”或“level”。在本文中,我们将探讨如何使用C语言和两种数据结构——堆栈(Stack)和队列(Queue)——来检查一个字符串是否为回文。

数据结构简介

堆栈(Stack)

堆栈是一种先进后出(FILO)的数据结构,可以想象成一摞盘子,你只能取最上面的盘子,也只能在最上面添加新的盘子。在本程序中,我们使用一个数组stack来模拟堆栈,并通过一个变量top来跟踪堆栈顶部的元素。

队列(Queue)

队列是一种先进先出(FIFO)的数据结构,可以想象成排队买票,先来的人先买到票。在本程序中,我们使用一个数组queue来模拟队列,并通过两个变量frontrear来分别跟踪队列的首部和尾部元素。

程序逻辑

  1. 初始化:定义两个数组stackqueue,以及相关的控制变量topfrontrear,用于存储字符串字符,并初始化它们。

  2. 堆栈和队列操作:实现基本的堆栈和队列操作,包括pushpop操作用于堆栈,insertdeleteElement操作用于队列。

  3. 检查回文:通过以下步骤检查字符串是否为回文:

    • 将字符串的每个字符依次压入堆栈和插入队列。
    • 依次从堆栈弹出和从队列删除元素,比较这两个元素。由于堆栈和队列的操作特性,如果字符串是回文,这两个元素应该是相等的。
    • 如果所有相应位置的字符都相等,则字符串是回文;否则,不是回文

 --------------------------------------------------------------------------------------------------------------------------------------
附上完整代码:
 

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

#define SIZE 100  // 根据实际需求设定,足够存储输入的字符串

char stack[SIZE];
char queue[SIZE];
int top = -1, front = -1, rear = -1;

// 堆栈相关操作
void push(char c){
    // 堆栈满了的情况
    if(top == SIZE-1){
        printf("堆栈溢出\n");
        exit(1);
    }
    stack[++top] = c; // 把字符压入堆栈
}

char pop(){
    // 堆栈为空的情况
    if(top == -1){
        printf("堆栈下溢\n");
        exit(1);
    }
    return stack[top--]; // 弹出堆栈的顶部元素
}

// 队列相关操作
void insert(char c){
    // 队列满了的情况
    if(rear == SIZE-1){
        printf("队列溢出\n");
        exit(1);
    }
    if(front == -1) front = 0; // 如果队列一开始是空的,设置队列头部为 0
    queue[++rear] = c; // 向队列的尾部插入元素
}

char deleteElement(){
    // 队列为空或者头指针前进过尾指针的情况
    if(front == -1 || front > rear){
        printf("队列下溢\n");
        exit(1);
    }
    return queue[front++]; // 删除Queue的首部元素
}

// 检查字符串是否为回文
int checkPalindrome(char str[]){
    int i, len = strlen(str);

    // 逐字符压入堆栈和插入队列
    for(i = 0; i < len; i++){
        push(str[i]);
        insert(str[i]);
    }
    
    // 逐字符从堆栈和队列取出进行比较
    for(i = 0; i < len; i++){
        if(pop() != deleteElement()) return 0; // 如果某一对字符不相等,说明不是回文
    }
    
    return 1; // 所有对字符都相等,说明是回文
}

int main(){
    char str[SIZE], c;
    int i = 0;
    printf("请输入字符串 (以#结束): ");
    while ((c = getchar()) != '#' && c != '\n' && i < SIZE-1){
        str[i++] = c;
    }
    str[i] = '\0'; // 结束字符串

    // 判断并输出结果
    if(checkPalindrome(str)){
        printf("这个字符串是回文字符串。\n");
    } else {
        printf("这个字符串不是回文字符串。\n");
    }

    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值