1. 程式人生 > >PAT-乙-1009 1009 說反話 (20 分)

PAT-乙-1009 1009 說反話 (20 分)

在這裡插入圖片描述

程式碼(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());

結果

在這裡插入圖片描述