翻转句子中单词的顺序

少于 1 分钟读完

题目

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。

分析

翻转单词的顺序,却不改变字符顺序,把每个单词看作一个整体,该题就是明显的考查栈的题目——后进先出,从左向右第一个读到单词,最后一个输出。

如果用栈来解决的话,该如何在栈中存储单词呢?

指针!

为节省空间,不再用新的内存来存储字符串,而是只存储每个单词在字符串中的开始位置和结束位置。

定义一个结构体Word,它有两个指针,用来保存单词在句子中的开始和结束位置

typedef struct Word{
	char *phead;
	char *ptail;
}Word;

也可以不用char*指针,用两个整数保存数组下标。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 20

typedef struct Word{
	char *phead;
	char *ptail;
}Word;

typedef struct Stack{
	Word *w;
	int top;
}Stack;

void initStack(Stack *s)
{
	s->w = (Word *)malloc(sizeof(Word)*MaxSize);
	s->top = -1;
}

void push(Stack *s, Word word)
{
	if((s->top + 1) < MaxSize)
		s->w[++s->top] = word;
	else
		printf("Stack full\n");
}

Word *pop(Stack*s)
{
	if(s->top<0)
		printf("Stack empty\n");
	else
		return &s->w[s->top --];
}

void printWord(Word *w)
{
	for(; w->phead !=w->ptail; w->phead++)
		printf("%c", *w->phead);
	printf("%c ", *w->ptail);
}

void reverseSentence(char *str, int len)
{
	int i;
	Stack *s;
	s = (Stack*)malloc(sizeof(Stack));
	initStack(s);
	Word *w;
	w= (Word*)malloc(sizeof(Word));
	for(i=0; i<len; i++)
	{
		if((i==0 || str[i-1]==' ')&& str[i]!=' ')
			w->phead = (str+i);
		if((i==len-1 || str[i+1]==' ') && str[i]!=' ')
		{
			w->ptail = (str+i);
			push(s, *w);
		}
	}
	while(s->top > -1)
	{
		w = pop(s);
		printWord(w);
	}
	printf("\n");
	free(s);
	free(w);
}

int main()
{
	char *sentence="I am SwordStraw; welcome to http://onestraw.net";
	int len = strlen(sentence);
	reverseSentence(sentence, len);
	return 0;
}

留下评论