这是到很常见的题目,非常简单,但你用到数据结构了吗,或说你用对了吗?
通过这道题,你可以掌握:
- 如何将用户的输入,输出到控制台
- 如何分割字符串
- 如何正确使用数据结构
题目:输入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>
之所以要学习数据结构,就是由于很多现实问题都是满足数据结构模型的。比如此题的【翻转――栈】