1009 说反话

题目

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式

每个测试用例的输出占一行,输出倒序后的句子。

输入样例

Hello World Here I Come

输出样例

Come I Here World Hello

代码

#include <stdio.h>
#include <string.h>
#include <malloc.h>

//定义一个字符串数据结构
typedef struct string{
    char *s;
    size_t length;
    size_t size;
} string;

//用字符串作为元素定义一个线性表
typedef struct slist{
    string *list;
    size_t length;
    size_t size;
}slist;

//字符串初始化
void init(string *s){
    s->length = 0;
    s->s = (char *) malloc(sizeof(char)*10);
    if(!s->s)
        exit(-1);
    s->size = 10;
}

//字符串延长
void expand(string *s, size_t n){
    s->s = (char*) realloc(s->s,sizeof(char)*n+10);
    s->size = n+10;
}

//字符串写入
void write(string *s, char *source){
    if(s->size < strlen(source)){
        expand(s,strlen(source));
    }
    strcpy(s->s, source);
}

//线性表初始化
void s_init(slist *list){
    list->list = (string*) malloc(sizeof(string)*10);
    if(!list->list)
        exit(-1);
    list->length=0;
    list->size=10;
}

//线性表延长
void s_expand(slist *list){
    list->list = (string*) realloc(list->list,sizeof(string)*(list->size+10));
    if(!list->list)
        exit(-1);
    list->size += 10;
}

//线性表插入元素
void s_push(slist *list, string s){
    if(list->length == list->size-1)
        s_expand(list);
    //list->list[list->length] = s;
    init(&list->list[list->length]);
    write(&list->list[list->length],s.s);
    list->length++;
}

//字符串按照关键字分解成线性表,功能参考python的split函数
void split(slist *list, char key, char *source){
    int i=0, j=0, k=0;
    char *tmp;
    tmp = (char*)malloc(sizeof(char)*strlen(source));
    string tmp2;
    init(&tmp2);
    while(source[i]){
        if(source[i]==key){
            tmp[j] = '\0';
            write(&tmp2, tmp);
            s_push(list, tmp2);
            j=0;
            i++;
            continue;
        }
        tmp[j] = source[i];
        i++;
        j++;
    }
    tmp[j] = '\0';
    write(&tmp2,tmp);
    s_push(list,tmp2);
    free(tmp);
    free(tmp2.s);
}

//将线性表反转,说反话
void reverse(slist *list, int m, int n){
    string tmp;
    init(&tmp);
    while(m < n){
        write(&tmp, list->list[m].s);
        write(&list->list[m],list->list[n].s);
        write(&list->list[n],tmp.s);
        m++;
        n--;
    }
    free(tmp.s);
}

int main(void){
    char s[100];
    slist list;
    s_init(&list);
    //scanf("%s",s);
    gets(s);
    split(&list,' ',s);
    reverse(&list, 0, list.length-1);
    for(int i = 0; i<list.length; i++){
        if(i<list.length-1){
            printf("%s ",list.list[i].s);
        }else{
            printf("%s",list.list[i].s);
        }
        free(list.list[i].s);
    }
    free(list.list);
    return 0;
}

小结

  1. 这道题就是将输入的字符串肢解成单词,再逆序输出即可。
  2. 本题可以使用char类型的二维数组解决,也不会像现在的代码这么繁琐,但上述代码主要用于学习数据结构与算法。
  3. 定义的string类型实际上还是一个线性表,很多线性表的操作可以重复到string上来。
  4. 线性表套string类型,再反转是解决本题的思路。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值