数据结构——字符串(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;
}

猜你喜欢

转载自blog.csdn.net/zhangying_496/article/details/81412433