字符串----逆序

方法一:

#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024

int main()
{
	char str[MAXSIZE],d;
	gets(str);
	int len = strlen(str);
	for (int i = 0;i < len-1;++i)
	{
		for (int j = 0;j < len - i - 1;++j)
		{
			d = str[j];
			str[j] = str[j + 1];
			str[j + 1] = d;
		}
	}
	for (int i = 0;i < len;++i)
		printf("%c", str[i]);
	printf("\n");
	return 0;
}

方法二:普通逆序,额外分配空间

#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024

char *Reverse(char *s,int n)
{
	char *q = s;
//遍历字符串,当指针指向'\0'时循环结束
	while (*q)
		*q++;
//令q指针指向最后一个字符
	q -= 1;
	char *p = (char*)malloc(n);
	char *r = p;
//字符串逆序交换
	while (q >= s)
		*p++ = *q--;
	*p = '\0';
	return r;
}
int main()
{
	char str[MAXSIZE];
	gets(str);
	int len = strlen(str);
	printf("%s\n", Reverse(str,len));
	return 0;
}

方法三:原地逆序,不允许额外分配空间,设置两个指针分别指向字符串头部和尾部,然后交换两个指针所指的字符,并向中间移动指针直到交叉

#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024

char *Reverse(char *s)
{
	char *p = s;
	char *q = s;
	while (*q)
		++q;
	q--;
	while (q > p)
	{
		char t = *p;
		*p = *q;
		*q = t;
		p++;
		q--;
	}
	return s;
}

int main()
{
	char str[MAXSIZE];
	gets(str);
	int len = strlen(str);
	printf("%s\n", Reverse(str));
	return 0;
}

方法四:递归,不额外分配空间

#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024

char *Reverse(char *s,int left,int right)
{
	if (left >= right)
		return s;
	char t = s[left];
	s[left] = s[right];
	s[right] = t;
	Reverse(s, left + 1, right - 1);
}

int main()
{
	char str[MAXSIZE];
	gets(str);
	int len = strlen(str);
	printf("%s\n", Reverse(str,0,len-1));
	return 0;
}

方法五:非递归,不额外分配空间

#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024

char *Reverse(char *s,int left,int right)
{
	while (left < right)
	{
		char t = s[left];
		s[left] = s[right];
		s[right] = t;
		++left;
		--right;
	}
	return s;
}

int main()
{
	char str[MAXSIZE];
	gets(str);
	int len = strlen(str);
	printf("%s\n", Reverse(str,0,len-1));
	return 0;
}

方法五:异或,不允许分配额外空间,不允许使用临时变量

#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024

char *Reverse(char *s)
{
	char *p = s;
	char *q = s;
	while (*(p + 1) != '\0')
	{
		++p;
		*p = *p^*q;
		*q = *p^*q;
		*p = *p^*q;
		++q;
		--p;
	}
	return s;
}

int main()
{
	char str[MAXSIZE];
	gets(str);
	int len = strlen(str);
	printf("%s\n", Reverse(str));
	return 0;
}

方法六:利用字符串结束符'\0'所在位置作为交换空间,不允许分配额外空间,不允许使用临时变量

#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024

char *Reverse(char *s)
{
	char *r = s;
	char *p = s;
	char *q = s;
	while (*p != '\0')
		++p;
	q = p - 1;
	while (q > s)
	{
		*p = *q;
		*q = *s;
		*s = *p;
		++s;
		--q;
	}
	*p = '\0';
	return r;
}

int main()
{
	char str[MAXSIZE];
	gets(str);
	int len = strlen(str);
	printf("%s\n", Reverse(str));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39916039/article/details/81511287
今日推荐