PAT-乙-1009 1009 說反話 (20 分)
阿新 • • 發佈:2019-02-10
程式碼(c++版本)
#include <iostream> #include <string.h> #include <vector> using namespace std; int main(){ vector<string> v; string s; getline(cin, s); int start = 0; int end = 0; for(int i=0; i<s.length(); i++){ if(s.at(i)==' '){ end = i-1; v.push_back(s.substr(start, end-start+1)); start = i+1; } } v.push_back(s.substr(start, s.length()-start+1)); cout<<v.at(v.size()-1); for(int i=v.size()-2; i>=0; i--){ cout<<" "<<v.at(i); } cout<<endl; return 0; }
註解
(1)按行讀取:
string s;
getline(cin, s);
(2)vector的使用:
標頭檔案和宣告:
#include <vector>
vector<string> v;
插入:
v.push_back(s.substr(start, end-start+1));
查詢:
cout<<v.at(i);
求容量:
v.size()
(3)string取子串的方法:
s.substr(start, length)
@param start 起始索引
@param length 要取的子串長度
(4)整體思路
讀取一行文字,從頭到尾遍歷,找到空格,就意味著前面是一個單詞,加入vector。直到檔案末尾,再把最後一個單詞加入到vector。
缺點:只能處理正常格式文字,如遇到多個空格,或不規範格式,可能無法正確處理。
程式碼(java版本)
import java.util.Scanner; import java.util.Stack; import java.util.StringTokenizer; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ String s = sc.nextLine(); StringTokenizer st = new StringTokenizer(s); Stack<String> stack = new Stack<String>(); while(st.hasMoreTokens()){ stack.push(st.nextToken()); } while(stack.size()>1){ System.out.print(stack.pop() + " "); } System.out.println(stack.pop()); } } }
註解
(1)採用StringTokenizer分詞
利用hasMoreTokens()方法查詢是否有下一個單詞,如果有,利用nextToken()方法輸出。
import java.util.StringTokenizer;
StringTokenizer st = new StringTokenizer(s);
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
(2)利用棧實現逆序輸出
import java.util.Stack;
stack.push(st.nextToken());
while(stack.size()>1){
System.out.print(stack.pop() + " ");
}
System.out.println(stack.pop());