题目描述
将给定的字符串序列反转。
示例输入:
student. a am I
示例输出:
I am a student.
题目分析:
字符串的反转并不是真正意义上的反转,在反转的同时,不能将单词倒置。
对字符串考虑倒序输出,正好符合栈的出入规则,因此选用栈进行操作。
step.1首先,需要以空格为标记将单词分开,但是会出现一个问题,最后一个字母后面没有空格,如果不加入条件限定,会直接丢失最后一个单词。
选用解决办法,少一个空格,我们首先在原字符串多加一个空格,最后将栈顶元素,也就是多出的空格删除即可。
step.2然后,考虑单词的倒置问题,两次倒置即为正,因此我们可以选用栈作为每个单词的保存工具,临时栈将数据给总栈的时候,实现了第二次反转,解决了单词的倒置问题。
代码如下:
#include<iostream>
#include<stack>
using namespace std;
class Solution {
public:
string ReverseSentence(string str) {
if(str.empty())return str;
//每个单词都要反转一下,先来俩栈,一个存全部,一个只存一个单词
//保存一个单词
stack<char> sta1;
//保存全部字母
stack<char> sta2;
//注意空格这个划分标志
//翻转后的字符串
string re_str;
str+=' ';
for(int i=0;i<str.size();i++){
//遇到空格之前,字母全部进栈
//没遇到空格的时候
if(str.at(i)!=' '){
sta1.push(str.at(i));
continue;
}
//遇到空格的时候
else{
while(!sta1.empty()){
sta2.push(sta1.top());
sta1.pop();
}
sta2.push(' ');
}
}
//多余的空格去掉
sta2.pop();
while(!sta2.empty()){
re_str+=sta2.top();
sta2.pop();
}
return re_str;
}
};
int main(){
string str="student. a am I";
string re_str;
Solution s1;
re_str = s1.ReverseSentence(str);
cout<<re_str<<endl;
return 0;
}