程序员人生 网站导航

C语言强化(九)翻转句子中单词的顺序

栏目:php教程时间:2015-05-28 08:38:44

这是到很常见的题目,非常简单,但你用到数据结构了吗,或说你用对了吗?


通过这道题,你可以掌握:

  • 如何将用户的输入,输出到控制台
  • 如何分割字符串
  • 如何正确使用数据结构


题目:输入1个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。标点符号和普通字母1样处理。

 例如输入“I am a student.”,则输出“student. a am I”。


思路

1、获得字符串

首先要能够获得到用户输入的1串字符串,有两点需要注意:

1.如果使用cin<<,输出时会发现空格以后的字符串不被输出,以下图


解决方法:使用cin.getline(str,length)

2.由于用户输入的字符串长度1般不会和我们创造的字符数组长度1样,所以如果采取传统的i<str.size()去遍历,会发现输出很多个“烫”,由于数组没有初始化

以下图


解决方法:使用strlen(str)获得字符数组有效长度。


下面是用户输入输出的代码

<span style="font-size:14px;"> char str[100]; //输入提示 cout<<"请输入,长度少于100"<<endl; //用户输入 cin.getline(str,100); cout<<"所输入的字符串长度为:"; //输出长度 cout<<strlen(str)<<endl; //输出内容 for(int i=0;i<strlen(str);i++){ cout<<str[i]; } cout<<endl;</span>

2、翻转

实现了输入输出后,就是关键的翻转字符串了。

怎样进行翻转?利用字符数组的角标变换???拜托,这不是当初我们刚刚学习C语言时采取的方法吗,而对学过数据结构的人来讲,第1反应想到的是这么个宝贝――

先进后出,这是栈的特性!这在前面C语言强化(2)设计可以求最小元素的栈讲过。

把先输入的字符串放进栈中,最后出来的顺序不就翻转了吗?

所以我们要做的就是把字符串分割成1个个子串,然后塞进去栈中,再取出来,弄定!


翻转函数代码

<span style="font-size:14px;">void reverseStr(char * str){ //截取,使用栈结构实现翻转输出 char * p; vector<char*> vt; const char * split = " "; p = strtok (str,split); while(p!=NULL) { //cout<<p; vt.push_back(p);//塞进去栈中 p = strtok(NULL,split); //继续分割字符串 } //利用栈结构的特性,从上往下遍历 while(vt.size()>0){ cout<<vt[vt.size()⑴]<<" "; vt.pop_back(); } cout<<endl; }</span>


完全源代码

<span style="font-size:14px;">#include <stdio.h> #include<stdlib.h> #include <iostream> #include<sstream> #include <vector> using namespace std; /** 翻转句子中单词的顺序。 题目:输入1个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。 句子中单词以空格符隔开。为简单起见,标点符号和普通字母1样处理。 例如输入“I am a student.”,则输出“student. a am I”。 思路 1.用户输入1串字符串,把它输出来 2.截取,使用栈结构实现翻转输出 */ void reverseStr(char * str){ //截取,使用栈结构实现翻转输出 char * p; vector<char*> vt; const char * split = " "; p = strtok (str,split); while(p!=NULL) { //cout<<p; vt.push_back(p);//塞进去栈中 p = strtok(NULL,split); //继续分割字符串 } //利用栈结构的特性,从上往下遍历 while(vt.size()>0){ cout<<vt[vt.size()⑴]<<" "; vt.pop_back(); } cout<<endl; } void main() { /* 输入输出 */ char str[100]; //输入提示 cout<<"请输入,长度少于100"<<endl; //用户输入 //cin>>str;//不可以这样! cin.getline(str,100); cout<<"所输入的字符串长度为:"; //输出长度 cout<<strlen(str)<<endl; //输出内容 //cout<<str<<endl; /* //不能这样输出! for(int i=0;i<100;i++){ cout<<str[i]; } */ for(int i=0;i<strlen(str);i++){ cout<<str[i]; } cout<<endl; reverseStr(str); system("pause"); }</span>

之所以要学习数据结构,就是由于很多现实问题都是满足数据结构模型的。比如此题的【翻转――栈】
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐