PAT乙级1009——说反话

题目:

题目详情 - 1009 说反话 (20 分) (pintia.cn)

 

这道题乍一看还挺简单的,我的思路很明确,当时觉得可以用到栈,就是先进后出嘛,最后进的一个单词第一个输出来(简直是个小天才!)

但是栈只是数据结构C语言里面学的,难道我还要现写出栈和相关操作吗?当然不用哈哈,记得C++ STL里面有stack这一类型嘛,然后我就去现学了STL一系列原理和操作!

我觉得这道题最烦人的一个地方就是:如何从一连串输入中切割出字符串,为此,我想到了用vector,就是动态规划嘛,要是读取的字符不是空格,我就将它添加到一个向量中,最后这个向量就代表一个单词

然后再把这些字符串push进栈,最后再一个个pop出来不久好了吗!(唉,我真傻,真的)

 

下面实操时我就发现自己字符串的操作好像并不熟练,当时学C的时候就没有学好,而且把字符串的输入想复杂了,就不放我的垃圾代码了

下面是正确的代码,跟我的思路一样,但是更简单:

#include <iostream>
#include <stack>
using namespace std;
int main()
{
    stack<string> mystr;       //构造一个空栈
    string str;
    while(cin>>str)
    {
        mystr.push(str);
        if(getchar() == '\n')
            break;
    }
    while(!mystr.empty())    //经典的出栈操作 
    {
        cout<<mystr.top(); 
        mystr.pop();
        if(!mystr.empty()) 
            cout<<' ';
    }
    return 0;
}

这个思路是很清楚的,我当时主要卡在字符串的分割上:怎样从一连串的输入中切割开一个个单词呢?我甚至还查到了字符串的切割方法:C++常用字符串分割方法(转) - ~小小鸟~ - 博客园 (cnblogs.com)

其实这个实现很简单,我居然忘记了最简单的东西!!!那就是:

C++用cin输入的时候会忽略空格以后的字符!!!(草 怎么这个基础都能不记得!)所以直接从句子中一个个读取字符串就行了!!

C++如果想读取含有空格的字符串:cin.getline() 或 cin.get() 

好了,当解决掉如何一个个读取单词的问题时,剩下的就很简单了,单词push进栈,最后一个个出栈(这里涉及到典型的操作!一定牢记)

 

提示::一定要手敲代码!自己写!不要看别人写的!

这是我自己写时的代码,简直是东施效颦:

 

#include <iostream>
#include <stack>
using namespace std;
int main()
{
    stack <string> mystr;
    string str;
    
    while (getchar()!='\n')
    {
        cin>>str;
        mystr.push(str);
    }
    
    while (!mystr.empty())
    {
        cout<<mystr.top();
        mystr.pop();
        if (!mystr.empty())
        {
            cout<<' ';
        }
    }
    return 0;
}

 

输出很离谱:

 

 为什么呢?因为我第一个while语句的判断条件是 while (getchar()!='\n'),所以程序会将第一个输入的字母getchar单独提取出来判断了,所以第一个读取到的字符串实际上是少第一个字母的。

正确的:

while(cin>>str)
{
mystr.push(str);
if(getchar() == '\n')
break;
}

 

我一个字符串读取完,再getchar读取下一个,如果是换行符,我再停止。 

 

解法二:

我称之为古早解法,当时学python就是这么做的:

怎么说呢,就是我先读取整个字符串存储到数组里面,然后我倒着再读取这个数组,读到空格,我就将空格到末尾之间的内容输出:

直接上代码:

 

#include <stdio.h>
#include <string.h> 
int main() {
    char str[81]; //创建字符串
    gets(str); //读取字符串
    int i = 0; //数组下标 
    for (i = strlen(str); i > 0; i--) //从末尾开始遍历字符串 
    { 
        if (str[i] == ' ')    //如果遇到空格
        {  
            printf("%s ", &str[i+1]); //输出空格后的单词 
            str[i] = '\0'; //把空格改为 \0,使后续输出也只有一个单词
        }   
    } 
    printf("%s", &str[i]); //输出原字符串的第一个单词 
    return 0; 
} 

 

总结,通过这道题,复习了字符串知识,还学了一点STL!

 

posted @ 2021-11-26 00:49  EowynTang  阅读(62)  评论(0)    收藏  举报