數據結構——字符串(3)字符串單詞數量&&字符串逆序

使用字符數組保存字符串,進行操作。

/************************************************************************/
/*  刷題:字符串相關題目                                                   */
/************************************************************************/

/*          1.統計一行字符中單詞數目       */
int WordCount(string s)
{
    int count=0;
    int worldFlag=0;
    char c;
    for (int i=0;(c=s[i])!='\0';i++)
    {
        if (c==' ')
        {
            worldFlag=0;
        }
        else if (worldFlag ==0)
        {
            worldFlag=1;
            count++;
        }
    }
    printf("%d\n",count);
    return count;
}


/************************************************************************/
/*                          2.字符串逆序                                 */
/************************************************************************/  

//  /*******  (1)直接分配一個與原字符串等長的字符數組,然後反向拷貝即可                *******/
char *Reverse(char * s)     //main函數中實參用字符數組,所以這裏用一個字符指針
{

    char *q=s;
    while(*q++)
        ;                       //這個空語句不做任何操作,只是讓q指針找到最後一個元素

    q-=2;           //減2是因爲while循環中q爲空的時候,q又向後移動了1位
    char *p= new char[sizeof(char) *(q-s+2)];       //字符個數計算,要考慮結束符
    char *r=p;

    //逆序存儲
    while(q>=s)
    {
        *p++=*q--;
    }
    *p='\0';
    return r;


}


/****    (2)原地逆序,不分配新的存儲空間  ****/

//① 設置兩個指針
char *Reverse2(char *s)
{
    char *p=s;//設置兩個指針:指向頭和尾
    char *q=s;

    while (*q++)
        ;
    q-=2;

    while(p<=q)
    {
        char temp;
        temp=*p;
        *p++=*q;
        *q--=temp;

    }
    return s;
}

// ②遞歸法,從兩邊向中間,互相交換數據
char *Reverse3(char *s, int left, int right)            
{
    if (left>=right)
        return s;
    char temp=s[left];
    s[left]=s[right];
    s[right]=temp;
    Reverse3(s,left+1,right-1);

}

//③非遞歸法。從兩邊向中間,交換數據
char *Reverse4(char *s, int left, int right)
{
    if (left>=right)
        return s;
    while(left<=right)
    {
        char temp=s[left];
        s[left++]=s[right];
        s[right--]=temp;
    }
    return s;
}



/****    (3)原地逆序,不允許有臨時變量  ****/
//①異或操作
//②使用字符串結束符‘\0’作爲交換空間


/****    (4)按照單詞逆序:先將每個單詞反轉,然後再將整個字符串反轉  ****/
void ReverseSingleWord(char *p, char *q)
{
    while(p<q)
    {
        char temp=*p;
        *p++ =*q;
        *q-- =temp;
    }
}

char *WordReverse(char *s)
{
    char *p= s;
    char *q=s;
    while(*q !='\0')
    {
        if (*q == ' ')
        {

            ReverseSingleWord(p,q-1);
            q++;                    //指針後移,找下一個單詞
            p=q;
        }
        else
            q++;

    }
    ReverseSingleWord(p,q-1);
    ReverseSingleWord(s,q-1);
    return s;

}



/************************************************************************/
/*              3. 找出一個字符串中第一個只出現一次的字符                   */
/************************************************************************/  
char GetFirstSingleChar(char s[])
{
    if (s==NULL)
        return 0;
    const int size=256;
    unsigned count[size]={0};
    char buffer[size];
    char* q=buffer;


    for (const char *p=s; *p!=0; p++)       //這裏不用const也可以,爲什麼要用??
    {
        if ( ++count[(unsigned char)*p] ==1)
                *q++ =*p;
    }
    for (const char *p=buffer; p<q; p++)
    {
        if (count[(unsigned char)*p]==1)
                return *p;

    }

    return 0;
}

//判斷是否爲數字
void IsInt(char c)
{
    if (c>='0' && c<='9')
    {
        cout<<"c是整數:"<<c<<endl;
    }
    else
        cout<<"c不是整數"<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章