0
点赞
收藏
分享

微信扫一扫

数据结构之栈的应用-判断字符串是否是回文对称(非常详细C语言版)

----------------------✨🎉🎈==!!!热烈欢迎各位大佬!!!==🎈🎉✨---------------------

--------------------------------------------------------------------------🍻==专栏回顾==🍻-------------------------------------------------------------------------------


1.思路分析💡:

  1. 接收用户输入的字符串
  2. 循环将字符串中的字符逐个入栈
  3. 循环将字符逐个出栈,并且将出栈结果保存到一个字符数组中
  4. 利用strcmp()函数比较两个字符串是否相等,相等说明是回文,否则不是回文

2.代码实现💎:

# include <stdio.h>
# include <string.h>
# include <malloc.h>
//定义栈结构体
struct Stack {
	char * top;//栈顶指针
	char * base;//栈底指针
	int size;//栈大小
};

//初始化栈
void initStack(struct Stack * stack) {
	stack->size = 30;//定义栈的大小
	stack->base = (char *)malloc(sizeof(char)*(stack->size));//将栈底指针指向系统分配的连续内存的首地址
	stack->top = stack->base;//将栈顶指针也指向分配内存的首地址
}

//入栈
void push(struct Stack * stack,char input2) {
	*(stack->top)= input2;//将数据n输入到栈顶指针所指向的内存中
	stack->top++; //将栈顶指针在连续的内存中向下移动一位 (内存编号时从小到大的,向下移动一位就是指下一个内存单元)
}

//出栈
void pop(struct Stack * stack,char * output,int j) {
	stack->top--;//栈顶指针在内存中向上移动一位
	output[j]=*(stack->top);//将这个出栈的字符赋给输出的字符数组中对应的位置 
}

//判断是否是回文的函数
void isSymmetrical(struct Stack * stack,char* input) {
	int i = 0;//控制循环入栈 
	int j = 0;//控制循环出栈,同时当作出栈字符数组的下标 
	char input2;//记录入栈元素 
	char output[30];//定义出栈元素的字符数组 
	initStack(stack);//创建一个空栈 
	//循环入栈 
	while(input[i]!='\0') {//条件是当遇到字符'\0'时终止入栈,因为C中字符串结束的标志是'\0' 
		input2 = input[i];//将此次入栈的元素赋给input2,以便传递 
		push(stack,input2);//调用入栈函数 
		i++; 
	}
	//循环出栈,并且将每次的出栈结果保存到字符数组中
	while(input[j]!='\0'){//因为入了几次栈就出几次栈,所以条件和入栈一样,但是得定义一个新的变量j,因为i在入栈循环后值已经改变 
		pop(stack,output,j);//调用出栈函数 
		j++;
	}
	//使用strcmp()函数比较两个字符串(用户输入的字符串和出栈得到的字符串)是否相等
	if(strcmp(input,output)==0){
		printf("该字符串是回文\n"); 
	}else{
		printf("该字符串不是回文\n"); 
	} 	
}

int main(void) {
	int option;//用户操作
	int loop=1;//变量loop控制循环
	char input[30];//定义一个字符数组大小 
	struct Stack stack;//创建一个栈对象
	//初始化
	do {
		//界面
		printf("1.判断字符串是否为回文\n");
		printf("2.退出系统\n");
		printf("请输入你的操作:\n");
		scanf("%d",&option);
		switch(option) {
			case 1://进制转换
				printf("请输入你要判断的字符串:\n");
				scanf("%s",&input);
				isSymmetrical(&stack,input);//调用此函数判断是否是回文 		symmetrical:对称的
				break;
			case 2://退出系统
				loop=0;
				printf("你退出了系统......\n");
		}
		printf("\n\n");//每次执行完换两行,对用户视觉友好
	} while(loop);//循环条件为loop
}
举报

相关推荐

0 条评论