给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
分析:
因为每个单词都是由空格隔开所以可以使用空格来标记输出单词的初始位置,单词末尾的位置即是目前循环指针所处位置。
代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
getline(cin, str);
int len = str.length();
int count = 0; // 单词需要空格隔开
for (int i = len - 1; i >= 0; i--) {
int rear = 0, front = 0; // 定义 front 和 rear 指针
if (str[i] != ' ') {
rear = i; // rear 指向单词末尾
for (int j = i - 1; j >= 0; j--)
if (str[j] == ' ') {
front = j + 1; // front 指向空格后位置
break;
}
if (count > 0) // 判断是否要输出空格
cout << " ";
for (int k = front; k <= rear; k++) // 逆序打印
cout << str[k];
count++; // 累加单词数量
i = front - 1; // 移动到下一个单词末尾
}
}
cout << endl;
return 0;
}
从上面的代码可以看出先输入的字符总是后输出这恰恰和stack
(栈)的思想一样,在上面的代码中使用循环实现堆栈的时间复杂度是
O
(
n
2
)
O(n^2)
O(n2),如果用堆栈来实现这一过程则只需要
O
(
n
)
O(n)
O(n) 的时间复杂度。
优化后:
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<string> stk; // 声明一个空栈
string str;
while(cin >> str) // 读入空格表示读取完一个单词
stk.push(str); // 压栈
cout << stk.top();
stk.pop();
while (!stk.empty()) {
cout << " " << stk.top(); // 打印栈顶元素
stk.pop(); // 出栈
}
cout << endl;
return 0;
}