嗯....
这道题看起来挺像一个字符串的题,但其实却错了,它实质上却用了一个栈进行了一个模拟(当然还有一种鬼畜的做法,下面也会介绍到.....
首先先看题:
时间限制: 1 s
空间限制: 128000 KB
题目描述
给出一个英语句子,希望你把句子里的单词顺序都翻转过来
输入描述
输入包括一个英语句子。
输出描述
按单词的顺序把单词倒序输出
样例输入
I love you
样例输出
you love I
数据范围及提示
简单的字符串操作
思路一:
因为题目中有“翻转”两个字,首先想到先进后出,直接联想到栈,这里可以用手动栈进行模拟,思路主要是先将所有的字符全部输入,并且将读入的一串字符串倒序压入栈中。
然后用头指针top以此向下遍历,如果找到一个空格,说明这是一个单词,则将这个单词的每个字母依次输出,并加上空格(注意不仅要判断空格,还要特判一下是否为最后一个单词)....并且注意此种思路是对每一个字母进行操作
见手动栈代码:
1 #include <cstdio>2 #include <cstring>3 4 5 using namespace std;6 7 8 char s[105], stack[105];9 int main()
10 {
11 int top = -1;//初始化栈为空
12
13 gets(s);//将所有字符读入
14
15 for(int i = strlen(s); i >= 0; i--){//倒序
16 if(s[i] != ' '&& i != 0){// 确定两个边界
17 stack[++top]=s[i];// 只将除空格外的字符入栈
18 }
19 else// 遇到空格或者处理最后一个元素
20 {
21 if(i == 0){//当最后一个元素处理时
22 stack[++top] = s[i];//入栈
23 while(top)//判断栈是否为空
24 printf("%c",stack[top--]);//输出栈,不需加空格
25 }
26 //如果不是处理到最后一个元素,而只是遇到了空格而隔开
27 while(top)//不必加else判断,如果执行了上面的if语句,那么执行完之后栈肯定为空,下面语句不会再执行
28 printf("%c",stack[top--]);
29 printf(" ");//出栈时加上空格
30 }
31 }
32 return 0;
33 }
思路二:
同样是用栈,但是还可以用STL库中的栈,这样避免了头指针的麻烦性。思路大体就是定义一个string类型的栈,将输入的每一个单词作为一个整体压入栈中(注意while语句有坑,当你输入时会输入不完,所以在自己测试中要用Ctrl + z 停止操作,所以还是比较支持手动栈,这种做法不太严谨....)。当栈不为空的时候, 就从顶部输出每一个单词,并且给它在后面加上空格 ....此种思路是对每一个单词进行操作
见STL库栈代码:
1 #include<iostream> 2 #include<cstring> 3 #include<stack> 4 5 using namespace std; 6 7 stack<string> st;// 注意将栈设为字符串类型,压入的每一个元素都可以为一个字符串 8 9 int main() 10 { 11 string a;//存放单个单词的临时字符串 12 while(cin>>a) 13 { 14 st.push(a);//cin读取第一个单词,push入栈 15 } 16 while(!st.empty())//当栈非空时重复下列操作 17 { 18 cout<<st.top()<<" "; //输出栈顶元素,即最后一个单词 19 st.pop();//删除已输出的单词,此时倒数第二个单词为栈顶 20 } 21 return 0; 22 } 23 //自己测试时需Ctrl+Z结束读取
思路三:
这个题当然除了栈还可以用基础的string操作....(感觉这种操作好鬼畜啊QAQ....具体的思路就是用string类型的a来储存每一次读入的单词,我们再用一个string类型的s来储存答案,因为要逆着输出,而这里与上两个思路不太相同,前两个思路都是输出时进行倒序,而这种思路就是存储时就倒着存储...所以将原来s的基础上再在它的前面加上a和空格即可....(太鬼畜了...解释不清楚,还是看代码吧....(注意这种做法也是不太严谨,还是输入时要用Ctrl + z停止输入)
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 5 using namespace std; 6 7 int main() 8 { 9 string a,s; 10 s=" "; 11 while(cin>>a) 12 s=a+" "+s;//即为思路中解释不明白的地方... 13 cout<<s; 14 return 0; 15 }
嗯....
这三个思路其实哪一个都不错,取决于个人的习惯,思路一和思路二差不多,比较容易思考但代码有难度,但思路三思考起来有点困难,但是代码简便易懂....(总体来说这道题的解法还是比较全的了....