http://www.oschina.net/code/snippet_134658_24981/**
* 要求:1、不能开辟新的数组或者其他内存单元,使其空间复杂度为O(1)
* {空间复杂度:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度
* 如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)
* 表示该程序所占用的空间和所用数据量无关}
* 2、不能使用C++特性
*/
(一)
void swap(const char str[], char *head, char *tail);
void main()
{
char str[] = {'t','h','i','s',' ','i','s',' ','a','n',' ','a','p','p','l','e','\0'};
/**
* 思路:先整个字符串做反转操作,然后在对其中的单词做反转操作
*/
char *head = str; // 头指针
char *p = str; // 活动指针
while(*p != '\0')
{
p++; // 指针移到最后,指针只能做移动操作,而不能指哪打哪
}
p--; // '\o'不做反转操作,留着做字符串结束符
char *tail = p; // 尾指针
swap(str, head, tail); // 全部反转
p = str;
while(*p != '\0')
{
if(*p == ' ')
{
tail = p - sizeof(char);
// 将指针指向上一个元素的地址,数组是连续的存储单元,这里直接用地址减去一个char单元大小
swap(str, head, tail); // 反转字符串中的单词
head = p; // 反转后在移动指针
if(*head == ' ')
head++;
}
p++;
}
// 此时p指针已经移动到最后一个元素了
if(*p == '\0') /* 反转最后一个单词 */
{
tail = p - sizeof(char);
swap(str, head, tail); // 反转字符串中的单词
}
printf(str);
printf("\n");
head = NULL; // 防止野指针
p = NULL; // 防止野指针
tail = NULL; // 防止野指针
}
/************************************************************************/
/* 功能:反转字符数组中指定开头和结束位置的字符 */
/************************************************************************/
void swap(const char str[], char *head, char *tail)
{
while(head < tail)
{
char c = *head;
*head = *tail;
*tail = c;
head++;
tail--;
}
}
(二)
#include<stdio.h>
#include<string.h>
//翻转函数,将字符数组元素首尾互换
void swapstr(char *head,char *tail)
{
while(head < tail){
char c = *head;
*head = *tail;
*tail = c;
tail--;
head++;
}
}
int main(void)
{
char str[128] = {0};
printf("please input a sentence:\n");
// scanf("%s",str);
//此处建议使用fgets()函数,fgets()能够接收到空格和回车
fgets(str,128,stdin);
//去掉接收到的回车符
str[strlen(str)-1] = '\0';
char *p,*head,*tail;
p = head = tail =&str[0];
while(*tail != '\0'){
tail++;
}
tail -= sizeof(char);//定位最后一个字符的位置
swapstr(head,tail);//将整句话按照字母翻转
while(*p != '\0'){
//翻转字符数组中的单词
if(*p == ' '){
tail = p - sizeof(char);
swapstr(head,tail);
head = ++p;
}
//此处用while()或者if(),if版本参见源码
while(*head == ' '){
head++;
}
p++;
}
//最后一个单词的翻转
if(*p == '\0'){
tail = p - sizeof(char);
swapstr(head,tail);
}
puts(str);
return 0;
}