CODEVS 1205 单词反转
嗯....
?
這道題看起來挺像一個(gè)字符串的題,但其實(shí)卻錯(cuò)了,它實(shí)質(zhì)上卻用了一個(gè)棧進(jìn)行了一個(gè)模擬(當(dāng)然還有一種鬼畜的做法,下面也會(huì)介紹到.....
首先先看題:
時(shí)間限制: 1 s
空間限制: 128000 KB
題目等級(jí) : 青銅 Bronze ??題目描述?
給出一個(gè)英語句子,希望你把句子里的單詞順序都翻轉(zhuǎn)過來
輸入描述?
輸入包括一個(gè)英語句子。
輸出描述?
按單詞的順序把單詞倒序輸出
樣例輸入?
I love you
樣例輸出
you love I
數(shù)據(jù)范圍及提示
簡(jiǎn)單的字符串操作
?
思路一:
因?yàn)轭}目中有“翻轉(zhuǎn)”兩個(gè)字,首先想到先進(jìn)后出,直接聯(lián)想到棧,這里可以用手動(dòng)棧進(jìn)行模擬,思路主要是先將所有的字符全部輸入,并且將讀入的一串字符串倒序壓入棧中。
然后用頭指針top以此向下遍歷,如果找到一個(gè)空格,說明這是一個(gè)單詞,則將這個(gè)單詞的每個(gè)字母依次輸出,并加上空格(注意不僅要判斷空格,還要特判一下是否為最后一個(gè)單詞)....并且注意此種思路是對(duì)每一個(gè)字母進(jìn)行操作
見手動(dòng)棧代碼:
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){// 確定兩個(gè)邊界 17 stack[++top]=s[i];// 只將除空格外的字符入棧 18 } 19 else// 遇到空格或者處理最后一個(gè)元素 20 { 21 if(i == 0){//當(dāng)最后一個(gè)元素處理時(shí) 22 stack[++top] = s[i];//入棧 23 while(top)//判斷棧是否為空 24 printf("%c",stack[top--]);//輸出棧,不需加空格 25 } 26 //如果不是處理到最后一個(gè)元素,而只是遇到了空格而隔開 27 while(top)//不必加else判斷,如果執(zhí)行了上面的if語句,那么執(zhí)行完之后棧肯定為空,下面語句不會(huì)再執(zhí)行 28 printf("%c",stack[top--]); 29 printf(" ");//出棧時(shí)加上空格 30 } 31 } 32 return 0; 33 } 手動(dòng)棧?
思路二:
同樣是用棧,但是還可以用STL庫中的棧,這樣避免了頭指針的麻煩性。思路大體就是定義一個(gè)string類型的棧,將輸入的每一個(gè)單詞作為一個(gè)整體壓入棧中(注意while語句有坑,當(dāng)你輸入時(shí)會(huì)輸入不完,所以在自己測(cè)試中要用Ctrl + z 停止操作,所以還是比較支持手動(dòng)棧,這種做法不太嚴(yán)謹(jǐn)....)。當(dāng)棧不為空的時(shí)候, 就從頂部輸出每一個(gè)單詞,并且給它在后面加上空格 ....此種思路是對(duì)每一個(gè)單詞進(jìn)行操作
見STL庫棧代碼:
1 #include<iostream> 2 #include<cstring> 3 #include<stack> 4 5 using namespace std; 6 7 stack<string> st;// 注意將棧設(shè)為字符串類型,壓入的每一個(gè)元素都可以為一個(gè)字符串 8 9 int main() 10 { 11 string a;//存放單個(gè)單詞的臨時(shí)字符串 12 while(cin>>a) 13 { 14 st.push(a);//cin讀取第一個(gè)單詞,push入棧 15 } 16 while(!st.empty())//當(dāng)棧非空時(shí)重復(fù)下列操作 17 { 18 cout<<st.top()<<" "; //輸出棧頂元素,即最后一個(gè)單詞 19 st.pop();//刪除已輸出的單詞,此時(shí)倒數(shù)第二個(gè)單詞為棧頂 20 } 21 return 0; 22 } 23 //自己測(cè)試時(shí)需Ctrl+Z結(jié)束讀取 STL棧?
思路三:
這個(gè)題當(dāng)然除了棧還可以用基礎(chǔ)的string操作....(感覺這種操作好鬼畜啊QAQ....具體的思路就是用string類型的a來儲(chǔ)存每一次讀入的單詞,我們?cè)儆靡粋€(gè)string類型的s來儲(chǔ)存答案,因?yàn)橐嬷敵?#xff0c;而這里與上兩個(gè)思路不太相同,前兩個(gè)思路都是輸出時(shí)進(jìn)行倒序,而這種思路就是存儲(chǔ)時(shí)就倒著存儲(chǔ)...所以將原來s的基礎(chǔ)上再在它的前面加上a和空格即可....(太鬼畜了...解釋不清楚,還是看代碼吧....(注意這種做法也是不太嚴(yán)謹(jǐn),還是輸入時(shí)要用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 } 鬼畜操作?
嗯....
?
這三個(gè)思路其實(shí)哪一個(gè)都不錯(cuò),取決于個(gè)人的習(xí)慣,思路一和思路二差不多,比較容易思考但代碼有難度,但思路三思考起來有點(diǎn)困難,但是代碼簡(jiǎn)便易懂....(總體來說這道題的解法還是比較全的了....
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/New-ljx/p/10473621.html
總結(jié)
以上是生活随笔為你收集整理的CODEVS 1205 单词反转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ4061/Gym100624F
- 下一篇: scrapy 采集网页出现丢失url的问