数据结构算法:写一个递归算法来实现字符串的逆序存放

2023-11-18

题目要求:写一个递归算法来实现字符串的逆序存储,要求不另设存储空间

首先我们定一个一个存放字符串的结构体
 

typedef struct String
{
	ElemType * data;
	int length;
}String,*PString; //创建字符串的结构体

其中typedef 声明后的String 相当于 struct String,PString 相当于 struct String * 。ElemType是自定义的数据类型 由我们自己来定义

#define MaxSize 10
#define ElemType char

定义好一个字符串的数据结构我们首先对该结构体进行一个初始化的操作,我们需要一开始将长度定为0 代表目前字符串为空;
 

void Init_String(PString S)
{
	S->data = (ElemType *)malloc(sizeof(ElemType)*MaxSize); //创建一个内存为10的int型数组空间
	S->length=0;
}

初始化完成之后,我们就需要创建字符串,实现函数如下

其中 char temp = getchar() 这句 是为了避免程序接收输入字符串后面的结束标志'\0'而导致出现bug,所以以防万一最好加上这句;

而一般字符串我们都喜欢从1开始数起,所以一般从索引为1的地址为存入数据的起始地址,需要将索引为0的内存浪费掉

void Create_Stirng(PString S)
{
	printf("input the element of your string : \n");
	char str;
	scanf_s("%c",&str);
	char temp = getchar();
	while (str !='/')//end flag
	{
		S->length++;
		S->data[S->length] = str;
		scanf_s("%c",&str);
		temp = getchar();
	}
}

定义完了创建之后,我们就可以相继的定义辅助函数,列如遍历操作和交换操作,具体函数代码如下

遍历

void Traverse(PString S)
{
	for (int i = 1; i <=S->length; i++)
	{
		printf("%c ",S->data[i]);
	}
}

交换

需要注意的是,这里交换的时候需要传入值的地址,因为如果单传入的是值,那么只是形参接收数据进行改变,而不会改变实参的值;

void swap(char *x,char *y)
{
	char temp = *x;
	*x = *y;
	*y = temp;
}

完成以上的操作后,就可以开始我们的主要功能了,就是逆序存放字符串

很简单 假设一个字符串 a b c d e f g 我们如果想通过递归来实现逆序,那么我们只要设置一个标识符len 来记录当前访问是第几个元素,我们只需要访问到字符串一半的位置 也就是'd' 这个位置 我们就可以通过传入当前位置和当前位置对称的位置的地址到swap()函数中 就可以将两个地址的值发生交换

这里的 len值 就可以看做字符所在的索引值

void Reverse_Str(PString S)
{
	//判断字符串的长度
	int flag = (S->length)/2;
	int r = (S->length)%2;
	if(len<flag+r) //如果没有到达一半的位置
	{
		len++;
		Reverse_Str(S);
	}
	//swap
	swap(&S->data[len],&S->data[S->length+1-len]);
	len--;
}

如果看不懂 &S->data[len],&S->data[S->length+1-len  这句,没有关系,听我来给你分析

假设我们要传入的字符串为 a b c d e f g 那么该字符串的长度就为7,我们使用递归算法遍历到 ‘d’

这个位置结束,那么d的对应位置就是该字符串的总长度->7+1 减去 当前d所在的索引值 -> 4 得到的对应位置就是 4 那么d因为是中间的值那么他的对应元素就是他本身。

当d结束变换位置后 函数退回到了 len = 3 也就是'c' 那么c对应位置是不是就是e 怎么得到e呢?同样代入上面那个式子 总长度:7+1-len  = 5 我们可以数下发现e的位置就是5 那么依次往上退就可以将所有对应的位置进行一个交换 最终字符串完成了逆序操作。

下面给出完整代码实现,我用的是vs编译器

// ConsoleApplication15.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdlib.h"
#define MaxSize 10
#define ElemType char

typedef struct String
{
	ElemType * data;
	int length;
}String,*PString; //创建字符串的结构体
int len = 1;
void Init_String(PString S)
{
	S->data = (ElemType *)malloc(sizeof(ElemType)*MaxSize); //创建一个内存为10的int型数组空间
	S->length=0;
}
void swap(char *x,char *y)
{
	char temp = *x;
	*x = *y;
	*y = temp;
}
void Reverse_Str(PString S)
{
	//判断字符串的长度
	int flag = (S->length)/2;
	int r = (S->length)%2;
	if(len<flag+r) //如果没有到达一半的位置
	{
		len++;
		Reverse_Str(S);
	}
	//swap
	swap(&S->data[len],&S->data[S->length+1-len]);
	len--;
}

void Create_Stirng(PString S)
{
	printf("input the element of your string : \n");
	char str;
	scanf_s("%c",&str);
	char temp = getchar();
	while (str !='/')//end flag
	{
		S->length++;
		S->data[S->length] = str;
		scanf_s("%c",&str);
		temp = getchar();
	}
}
void Traverse(PString S)
{
	for (int i = 1; i <=S->length; i++)
	{
		printf("%c ",S->data[i]);
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	String S;
	Init_String(&S);
	Create_Stirng(&S);
	Traverse(&S);
	printf("\n");
	Reverse_Str(&S);
	Traverse(&S);
	return 0;
}

 

要是有哪些不懂的地方可以评论区留言哈,或者加我v:    Scavenger_self。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构算法:写一个递归算法来实现字符串的逆序存放 的相关文章

随机推荐

  • python实现逻辑回归三种方法_纯Python实现逻辑回归

    前几天使用后sklearn实现了逻辑回归 这里用纯python实现逻辑回归 首先 我们定义一个sigmoid函数 def sigmoid inX sigmoid函数 return 1 0 1 exp inX 这里使用梯度上升进行逻辑回归 梯
  • 【编译之美】【5. 代码优化:数据流分析】

    有些优化只能在全局优化中做 在本地优化中做不了 比如 代码移动 Code motion 能够将代码从一个基本块挪到另一个基本块 比如从循环内部挪到循环外部 来减少不必要的计算 循环剥离 部分冗余删除 Partial Redundancy E
  • 角落的开发工具集之Vs(Visual Studio)2017插件推荐

    工具善其事 必先利其器 装好这些插件让vs更上一层楼 因为最近录制视频的缘故 很多朋友都在QQ群留言 或者微信公众号私信我 问我一些工具和一些插件啊 怎么使用的啊 那么今天我忙里偷闲整理一下清单 然后在这里面公布出来 Visual Stud
  • 毕业设计-基于深度学习的花卉识别分类

    目录 前言 课题背景和意义 实现技术思路 一 花卉识别相关理论基础 二 基于 ResNeXt 和迁移学习的花卉种类识别 三 基于 EfficientNet 和迁移学习的花卉种类识别 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光
  • scss 中公共变量的导出方法:export

    前言 在使用vue或者react开发项目时都会用到scss 或者less等的扩展语言 那么肯定会有公共变量提取与使用 这篇文章就是记录如何导出公共css变量的 export 关键词 menuText bfcbd9 menuActiveTex
  • React 相关方法(API)介绍-元素与组件操作

    JSX可以减少定义组件的复杂性 但对于React来说JSX并不是必须的 JSX标签最终会被转换为原生的JavaScript 除使用JSX语法外 还可以使用React提供的API来创建组件 本文将介绍使用React创建元素 及一些React中
  • 类与对象基础

    1 面向对象概述 面向过程就是分析出解决问题所需要的步骤 然后用函数把这些步骤一一实现 使用的时候依次调用就可以了 面向对象则是把构成问题的事务按照一定规则划分为多个独立的对象 然后通过调用对象的方法来解决问题 当然 一个应用程序会包含多个
  • JAVA构造方法与static 关键字

    JAVA的构造方法 什么是构造方法 构造方法用来生成一个实例化的对象并对对象实例中的成员变量进行初始化 采用new创建对象时 构造方法被执行 构造方法的方法名必须和类名保持一致 注意 构造方法没有返回值 不可以加void 只能用 publi
  • 设计模式之命令模式

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • 【2021应用上架】超详细开发者账号申请&应用上架审核经验整理

    一 准备阶段需要注意的 1 上架前开发者账号申请 申请的主体确定 在公司有多个主体的情况下 用哪个公司主体认证开发者 上架APP时需要考虑到应用相关的各种材料申请在哪个公司名下 材料所属公司主体与开发者账号主体不一致的情况需要开发者花费时间
  • vue节流和防抖

    节流 节流是间隔执行 在定时器到时间后再清空定时器 函数将每个 n 秒执行一次 在内部定义一个定时器和一个开关变量 初始化变量为true 执行定期器前判断变量是否false 就return 为true 如果是继续执行 并且把变量赋值为fal
  • 使用JSON.toJSONString时,出现“$ref”怎么办?服务器返回对象显示$ref怎么解决?

    现象 代码 Map
  • nvm 和 nrm安装使用

    前端工具推荐 nvm Node 版本管理工具 和 nrm 管理npm源 一 nvm 如果直接将 node 安装到电脑上 通常只能安装某个特定的版本 如 v18 12 1 而某些老项目可能只支持老版本的 node 如 v14 19 3 这时候
  • UNIX网络编程卷一 学习笔记 第三十章 客户/服务器程序设计范式

    开发一个Unix服务器程序时 我们本书做过的进程控制 1 迭代服务器 iterative server 它的适用情形极为有限 因为这样的服务器在完成对当前客户的服务前无法处理已等待服务的新客户 2 并发服务器 concurrent serv
  • 解决win10升级到win11,打不开安全中心的问题(亲测有效,已修复)

    相信很多人也碰上过这种问题 升级到了win 11 但是安全中心打不开了 报错 需要使用新应用以打开此windowsdefender链接 但是微软的应用商店并没有这个软件 然后我实验了一种方法 1 去微软的应用商店 Microsoft Sto
  • mysql中如何操作varchar类型的日期进行比较、排序等操作

    在mysql使用过程中 日期一般都是以datetime timestamp等格式进行存储的 但有时会因为特殊的需求或历史原因 日期的存储格式是varchar 那么我们该如何处理这个varchar格式的日期数据呢 使用函数 STR TO DA
  • SSM框架基于JSP犬舍寄养系统

    项目介绍 SSM框架基于JSP犬舍寄养系统的设计与实现 高清视频演示 SSM框架基于JSP犬舍寄养系统的设计与实现 安装视频演示 SSM框架基于JSP犬舍寄养系统的设计与实现 系统说明 1 前台功能模块 首先注册会员 登录进平台 然后选择自
  • 【PyTorch学习】(三)自定义Datasets

    torchvision datasets源码地址 https github com pytorch vision blob master torchvision datasets 前两篇从搭建经典的ResNet DenseNet入手简单的了
  • 【LVGL 学习】样式(style)风格学习

    概述 在 LVGL 中 样式都是以对象的方式存在 一个对象可以描述一种样式 每个控件都可以独立添加样式 创建的样式之间互不影响 可以使用 lv style t 类型创建一个样式并初始化 static lv style t style lv
  • 数据结构算法:写一个递归算法来实现字符串的逆序存放

    题目要求 写一个递归算法来实现字符串的逆序存储 要求不另设存储空间 首先我们定一个一个存放字符串的结构体 typedef struct String ElemType data int length String PString 创建字符串