天天看點

編寫字元串反轉函數

首先用數組下标的形式實作:

提供三種方法:

    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;   } 
         

繼續閱讀