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!
本文来自博客园,作者:EowynTang,转载请注明原文链接:https://www.cnblogs.com/tangcoder/p/15605826.html

浙公网安备 33010602011771号