用栈的思想判断回文字符串(C语言)

题目:输入一个字符串并且判断字符串是否为回文。

复制代码
#include<stdio.h>
#include<string.h>   // 包含strlen函数所需的头文件
#include<stdbool.h>  // 包含bool类型所需的头文件

#define MAX_STACK_SIZE 100  // 定义栈的最大大小
//定义栈结构
typedef struct
{
	char data[MAX_STACK_SIZE];
	int top;
}Stack;

//初始化栈 
void initStack(Stack *s)
{
	s->top = -1;
}

//压栈
void push(Stack *s,char c)
{
	if(s->top < MAX_STACK_SIZE - 1)
	{
		s->data[++(s->top)] = c;
	}
 } 

//弹栈
char pop(Stack *s)
{
	if(s->top >= 0)
	{
		return s->data[(s->top)--];
	}
	return '\0'; //栈空返回空字符
 } 

//判断字符串是否为回文
bool isPalindrome(const char *str)
{
	Stack s;
	initStack(&s);
	int i;
	int len = strlen(str);
	
	if(len <= 1)
	{
		return true;
	}
	
	//将前半部分字符入栈
	for(i = 0; i < len/2; i++)
	{
		push(&s, str[i]);
	}
	
	//确定后半部分起始索引
	int start = len % 2 == 0 ? len/2 : len/2 + 1;
	
	//比较后半部分与栈中弹出的字符
	for(i = start; i < len; i++)
	{
		if(pop(&s) != str[i])
		{
			return false;
		}
	} 
	
	return true;
}

int main()
{
	char input[100];
	printf("请输入一个字符串:");
	fgets(input, sizeof(input), stdin);
	input[strcspn(input, "\n")] = '\0';  // 去除换行符
	
	if(isPalindrome(input))
	{
		printf("\"%s\" 是回文字符串。\n", input);
	 } 
	else
	{
		printf("\"%s\" 不是回文字符串。\n", input);
	}
	
	return 0;
}

输出:

相关推荐
SomeB1oody10 分钟前
【RustyML入门】3.8. 正则化与归一化层
开发语言·后端·机器学习·rust·教程
__zRainy__13 分钟前
Node系列 · Node基础:全局变量与全局对象
开发语言·前端·javascript
LuminousCPP30 分钟前
单链表专题(四)-刷题复盘篇-LeetCode 138 随机链表复制|原地拷贝法突破复杂指针操作
数据结构·笔记·算法·leetcode·链表
鬼手点金1 小时前
Scrapy + Playwright 完整示例(JS 动态渲染网页)
开发语言·javascript·爬虫·python·scrapy·html·json
Mr. zhihao1 小时前
深度解析:为什么Java序列化需要搭配ByteArrayOutputStream?IO装饰器模式的精妙设计
java·开发语言·装饰器模式
逆境不可逃1 小时前
【LeetCode 912】排序数组——随机化快速排序详解
数据结构·算法·排序算法
Coder-magician1 小时前
《代码随想录》刷题打卡day31:动态规划-背包问题part02
算法·动态规划
薛定e的猫咪1 小时前
从因果视角解决多智能体协作:细读 SCIC 算法
算法
c238561 小时前
《算法武林谱:四大排序神功与二分寻宝术全解》
数据结构·算法·排序算法
格林威1 小时前
多相机并行采图最佳实践:Task.WhenAll + 异常处理 + 资源释放
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·机器视觉