1. 程式人生 > 實用技巧 >2.5 字串

2.5 字串

字串是什麼

  • 字串(string): 是由 n 個字元組成的一個有序整體( n >= 0 )。例如,s = "BEIJING" ,s 代表這個串的串名,BEIJING 是串的值。這裡的雙引號不是串的值,作用只是為了將串和其他結構區分開。字串的邏輯結構和線性表很相似,不同之處在於字串針對的是字符集,也就是字串中的元素都是字元,線性表則沒有這些限制。
  • 空串: 指含有零個字元的串。例如,s = ""
  • 空格串: 只包含空格的串。它和空串是不一樣的,空格串中是有內容的,只不過包含的是空格,且空格串中可以包含多個空格。例如,s = " "
  • 子串: 串中任意連續字元組成的字串叫作該串的子串。
  • 原串(主串):例如:a = "BEI",b = "BEIJING",c = "BJINGEI" 。
    • 對於字串 a 和 b 來說,由於 b 中含有字串 a ,所以可以稱 a 是 b 的子串,b 是 a 的主串;
    • 而對於 c 和 a 而言,雖然 c 中也含有 a 的全部字元,但不是連續的 "BEI" ,所以串 c 和 a 沒有任何關係。

字串的儲存結構與線性表相同,也有順序儲存和鏈式儲存兩種。

  1. 字串的順序儲存結構(java中採用這種方式),是用一組地址連續的儲存單元來儲存串中的字元序列,一般是用定長陣列來實現。有些語言會在串值後面加一個不計入串長度的結束標記符,比如 \0 來表示串值的終結。
  2. 字串的鏈式儲存結構,與線性表是相似的,但由於串結構的特殊性(結構中的每個元素資料都是一個字元),如果也簡單地將每個鏈結點儲存為一個字元,就會造成很大的空間浪費。因此,一個結點可以考慮存放多個字元,如果最後一個結點未被佔滿時,可以使用 "#" 或其他非串值字元補全

例題

給定一個字串,逐個翻轉字串中的每個單詞。例如,輸入: "girl friend have broken up",輸出: "up broken have friend girl "。

解:利用棧的特性處理

import java.util.Stack;

public class StringTest {

	public static void main(String[] args) {
		String s = "girl friend have broken up";
		reverse(s);

	}

	private static void reverse(String s) {

		Stack<String> stack = new Stack<String>();
		String temp = "";
		for (int i = 0; i < s.length(); i++) {
			char element = s.charAt(i);
			
			//如果是空格就 入棧
			if (!Character.isSpaceChar(element)) {
				temp += element;
			} else {
				stack.push(temp);
				temp = "";
			}
			
			//入棧 最後一個單詞
			if(i==s.length()-1) {
				stack.push(temp);
			}

		}
		
		while(!stack.isEmpty()) {
			System.out.print(stack.pop()+" ");
		}

	}

}