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>

    之所以要学习数据结构,就是因为很多现实问题都是满足数据结构模型的。比如此题的【翻转——栈】
  • 相关阅读:
    一种无法被Dump的jar包加密保护解决方案
    基于设备指纹零感验证系统
    IOS防作弊产品技术原理分析
    某移动端防作弊产品技术原理浅析与个人方案构想
    web安全防御之RASP技术
    Linux漏洞分析入门笔记-Off-By-One(栈)
    smb中继学习
    Dedecms sp2 5.7 后台getshell审计
    phpmyadmin后台代码执行分析复现
    静态恶意代码逃逸-学习一
  • 原文地址:https://www.cnblogs.com/javdroider/p/5184289.html
Copyright © 2011-2022 走看看