IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o -> 正文阅读

[数据结构与算法]函数实现字符串逆序(递归与非递归两种方法哦ヾ(≧▽≦*)o

#include<stdio.h>
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
void reverse_string(char* str)
{
	int left = 0;
	int right = my_strlen(str) - 1;
	while (left < right)
	{
		char tmp = str[left];
		str[left] = str[right];
		str[right] = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcdef";//首先定义数组为字符串abcdef
	reverse_string(arr);//调用函数,使得数组arr内的字符串逆序调换
	printf("%s\n", arr);//打印逆序转换之后的字符串arr
	return 0;
}
#include<stdio.h>
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
void reverse_string(char* str)
{
	char tmp = *str;
	int len = my_strlen(str);
	*str = *(str + len - 1);
	*(str + len - 1) = '\0';
	if (my_strlen(str + 1))
	{
		reverse_string(str + 1);
	}
	*(str + len - 1) = tmp;
}
int main()
{
	char arr[] = "abcdef";//首先定义数组为字符串abcdef
	reverse_string(arr);//调用函数,使得数组arr内的字符串逆序调换
	printf("%s\n", arr);//打印逆序转换之后的字符串arr
	return 0;
}

我们要实现将abcdef这一串字符逆序打印。那么我们肯定是需要使用函数的,但是根据是否使用递归我们就又可以分成两种不同方式

————————这是一条分割线(?′?`?)———————————

第一种:非递归方式

我们要实现字符串的逆序,最最基本的思路就是对字符串进行两两交换。首先定义逆序交换字符串的函数名为reverse_string,即字符串交换,我们需要让这个函数在调用是能够交换字符abcdef

那么下一步,我们就要去定义这个逆序交换字符串的函数reverse_string

本函数目的为实现字符串逆序,所以不需要返回值,我们设定函数返回值为void,同时函数参数设置为存储字符的char类型,数组名arr是数组arr首元素的地址,即为a的地址;char*str,即char*的指针接受a的地址

接着我们用两个整型来表示第一个字符a和最后一个字符f的下标,字符a的下标为0即int left = 0;字符f的下标我们可以用字符串的长度减去1,即int right = strlen(str)-1,同时引入头文件#include<string.h>

下一步,就将left与right进行交换,借助一个中间变量tmp

先将str[left]赋给char tmp,再将str[right]赋给str[left],最后将tmp赋给str[right]即可。

如何让它们重复这个过程呢?答案是将它们放在一个循环里!使用while循环,让它们两侧同时往中间走,然后将字符进行交换,当left<right时执行这个循环。什么?为什么不是left=right,喂,一个字符还有左右交换的必要嘛?

拓展问题:万一题目中规定了不允许使用C语言中的库函数我们该怎么办?

也就是说我们不能使用strlen而需要自己去写一个my_strlen的函数

由于strlen后面括号里面是str,那么我们也需要一个str指针来接收即为char*str

接着定义一个计数器 int count=0

如果*str!=\0说明这时我找到了一个非\0的字符,这时计数器count要++一下,str指针也要++一下,向后找一个字符;最终返回计数器即为字符串长度(or字符个数)

—————————(′▽`???)这是第二条分割线—————————

第二种:递归方式

采用递归方式那么我们就要思考一下递归该如何实现首尾两个数的交换

第一步 把a拿出来

第二步:把f放到原来a的位置

第三步 将原来f的位置放上\0

为什么不是直接将a放在原来f的位置呢?如果我们将a直接放在原来f的位置,那么在调用reverse函数的时候就会从b开始然后读取b c d e a多了一个a,这样交换的时候就会将首项b与最后的a交换,为了防止这种情况出现,我们选择先在原来f的位置放上\0,使得调用reverse函数的时候读取b c d e 遇到\0时停止

第四步 对b c d e 进行逆序

最后一步 将a拿上去!

那么我们该如何用代码来实现这一过程?

首先将a拿出来:我们需要引入一个新的字符型变量,然后将字符a的地址赋给新变量tmp,即为char tmp =*str,*str指向的是最开始a的位置。

下一步我们需要将f放在a的位置。先调用my_strlen函数计算字符串的总长度,引入整型变量len,通过int len = my_strlen(str)得到

接着我们用f的地址来代替a的地址,通过*str=*(str + len – 1)来实现

第三步我们需要在f的空位放上\0,只需要将\0放在f的地址上即可,即为*(str+len-1)=’\0’

第四步进行中间四个字符的逆序翻转,这时我们可以直接调用reverse函数,但是在调用函数之前需要给出判断条件,否则程序无法结束,我们知道,当只有一个字符或者没有字符的时候是不需要逆序的,因此我们对于中间字符判断是否需要逆序的时候,首先需要设定字符个数大于等于2即if(my_strlen(str+1)>2),再调用reverse函数

最后一步将a放回去,这就简单啦~只需要用tmp的地址放到原来f地址那里就可以咧,*(str+len-1)=tmp就OK啦嘻嘻

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 13:19:22  更:2022-01-16 13:20:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:56:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码