zoukankan      html  css  js  c++  java
  • C语言强化(九)翻转句子中单词的顺序

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


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

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


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

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


    思路

    一、获取字符串

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

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


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

    2.由于用户输入的字符串长度一般不会和我们创造的字符数组长度一样,所以如果采用传统的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>

    二、翻转

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

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

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

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

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


    翻转函数代码

    <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()-1]<<" ";
    		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;
    
    /**
    
    翻转句子中单词的顺序。
    题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
    句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
    例如输入“I am a student.”,则输出“student. a am I”。
    
    思路
    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()-1]<<" ";
    		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>

    之所以要学习数据结构,就是因为很多现实问题都是满足数据结构模型的。比如此题的【翻转——栈】
  • 相关阅读:
    从零开始编写自己的C#框架(7)——需求分析
    从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)
    Vim技能修炼教程(13)
    Linux存储入门:简易数据恢复方案--分区和LVM实战
    物联网如何跳出“看起来很美”?
    农业的未来:物联网农业传感器农业无人机
    综合布线系统技术是建设智慧城市的血脉
    7月13日云栖精选夜读:什么才是这个时代最需要的BI人员? —— 阿里云MVP赵玮主题分享
    阿里巴巴集团技术委员会主席王坚:我曾经被诺贝尔奖得主司马贺忽悠_相信人工智能就是未来!
    如何送货最省钱?菜鸟自研核心引擎架构首次曝光!
  • 原文地址:https://www.cnblogs.com/javdroider/p/5184289.html
Copyright © 2011-2022 走看看