CODEVS 1205 单词反转
嗯....
?
這道題看起來挺像一個字符串的題,但其實卻錯了,它實質上卻用了一個棧進行了一個模擬(當然還有一種鬼畜的做法,下面也會介紹到.....
首先先看題:
時間限制: 1 s
空間限制: 128000 KB
題目等級 : 青銅 Bronze ??題目描述?
給出一個英語句子,希望你把句子里的單詞順序都翻轉過來
輸入描述?
輸入包括一個英語句子。
輸出描述?
按單詞的順序把單詞倒序輸出
樣例輸入?
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結束讀取 STL棧?
思路三:
這個題當然除了棧還可以用基礎的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 } 鬼畜操作?
嗯....
?
這三個思路其實哪一個都不錯,取決于個人的習慣,思路一和思路二差不多,比較容易思考但代碼有難度,但思路三思考起來有點困難,但是代碼簡便易懂....(總體來說這道題的解法還是比較全的了....
?
?
轉載于:https://www.cnblogs.com/New-ljx/p/10473621.html
總結
以上是生活随笔為你收集整理的CODEVS 1205 单词反转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ4061/Gym100624F
- 下一篇: scrapy 采集网页出现丢失url的问