首先用數組下标的形式實作:
提供三種方法:
1、有中間變量
2、無中間變量
3、堆棧實作
#include <stdio.h>
#include <string.h>
void reverse_str(char * ch);
void reverse_str2(char *ch);
int main(void)
{
char c[] = "Can you reverse me?";
printf("original string c: /n%s/n", c);
reverse_str(c);
printf("reversed string after calling reverse_str: /n%s/n", c);
reverse_str2(c);
printf("reversed string after calling reverse_str2: /n%s/n", c);
system("pause");
return 0;
}
void reverse_str(char *ch)
{
int len;
int i;
len = strlen(ch)-1;
char ctemp;
for(i = 0; i < len-i; i++)
{
ctemp = ch[i];
ch[i] = ch[len-i];
ch[len-i] = ctemp;
}
ch[len+1] = 0;
}
-------------------------------------------------------
void reverse_str2(char *ch)
{
int len;
int i;
len = strlen(ch)-1;
char ctemp;
for(i = 0; i < len-i; i++)
{
ch[i] = ch[i] ^ ch[len-i];
ch[len-i] = ch[i] ^ ch[len-i];
ch[i] = ch[i] ^ ch[len-i];
}
ch[len+1] = 0;
}
---------------------------------------------------------
//堆棧實作
我沒有記錯的話是一道MSN的筆試題,網上無意中看到的,拿來做了一下。題目是這樣的,給定一個字元串,一個這個字元串的子串,将第一個字元串反轉,但保留子串的順序不變。例如:
輸入: 第一個字元串: "This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn"
子串: "zhuxinquan"
輸出: "nc/moc.zhuxinquan.www//:ptth :etis esenihC s'zhuxinquan si sihT"
一般的方法是先掃描一邊第一個字元串,然後用stack把它反轉,同時記錄下子串出現的位置。然後再掃描一遍把記錄下來的子串再用stack反轉。我用的方法是用一遍掃描數組的方法。掃描中如果發現子串,就将子串倒過來壓入堆棧。
最後再将堆棧裡的字元彈出,這樣子串又恢複了原來的順序。源代碼如下:
#include <iostream>
#include <cassert>
#include <stack>
using namespace std;
//reverse the string 's1' except the substring 'token'.
const char* reverse(const char* s1, const char* token)
{
assert(s1 && token);
stack<char> stack1;
const char* ptoken = token, *head = s1, *rear = s1;
while (*head != '/0')
{
while(*head!= '/0' && *ptoken == *head)
{
ptoken++;
head++;
}
if(*ptoken == '/0')//contain the token
{
const char* p;
for(p=head-1;p>=rear;p--)
stack1.push(*p);
ptoken = token;
rear = head;
}
else
{
stack1.push(*rear);
head=++rear;
ptoken = token;
}
}
char * return_v = new char[strlen(s1)+1];
int i=0;
while(!stack1.empty())
{
return_v[i++] = stack1.top();
stack1.pop();
}
return_v[i]='/0';
return return_v;
}
int main(int argc, char* argv[])
{
cout<<"This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn/n";
cout<<reverse("This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn","zhuxinquan");
return 0;
}
以下是用指針實作:
題目:
編寫函數reverse_string,它的原型如下:
void reverse_string(char *str);
函數把參數字元串中的字元串反向排列。請使用指針而不是數組下标,不要使用任何C函數庫中用于操縱字元串的函數。提示:不要聲明一個局部數組來臨時存儲參數字元串。
算法:
關于反轉字元串的方法很多。這裡我給出我想到的一種算法。
/************反轉字元串************/
編寫字元串反轉函數
void reverse_str(char *str)
編寫字元串反轉函數
編寫字元串反轉函數
編寫字元串反轉函數
{
編寫字元串反轉函數
char *cp = str;
編寫字元串反轉函數
int i=0;
編寫字元串反轉函數
while(*str!= '/0')
編寫字元串反轉函數
編寫字元串反轉函數
編寫字元串反轉函數
{
編寫字元串反轉函數
str++;
編寫字元串反轉函數
i++;
編寫字元串反轉函數
}
編寫字元串反轉函數
編寫字元串反轉函數
i /= 2;
編寫字元串反轉函數
str--;
編寫字元串反轉函數
while(i-- > 0)
編寫字元串反轉函數
編寫字元串反轉函數
編寫字元串反轉函數
{
編寫字元串反轉函數
*str ^= *cp;
編寫字元串反轉函數
*cp ^= *str;
編寫字元串反轉函數
*str ^= *cp;
編寫字元串反轉函數
編寫字元串反轉函數
str--;
編寫字元串反轉函數
cp++;
編寫字元串反轉函數
}
編寫字元串反轉函數
}
說明:
算法中運用了:a ^ a = 0 和 a ^ 0 = a 的特性。以此來進行變量值的交換,可以避免使用額外的臨時變量
另外C标準字元串反轉函數strrev
原型:extern char *strrev(char *s); 用法:#include <string.h> 功能:把字元串s的所有字元的順序颠倒過來(不包括空字元NULL)。 說明:傳回指向颠倒順序後的字元串指針。 舉例: // strrev.c #include <syslib.h> #include <string.h> main() { char *s="Welcome To Beijing"; clrscr(); textmode(0x00); // 6 lines per screen printf("%s/n%s",s,strrev(strdup(s))); getchar(); return 0; }