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 没有任何关系。
字符串的存储结构与线性表相同,也有顺序存储和链式存储两种。
- 字符串的顺序存储结构(java中采用这种方式),是用一组地址连续的存储单元来存储串中的字符序列,一般是用定长数组来实现。有些语言会在串值后面加一个不计入串长度的结束标记符,比如 \0 来表示串值的终结。
- 字符串的链式存储结构,与线性表是相似的,但由于串结构的特殊性(结构中的每个元素数据都是一个字符),如果也简单地将每个链结点存储为一个字符,就会造成很大的空间浪费。因此,一个结点可以考虑存放多个字符,如果最后一个结点未被占满时,可以使用 "#" 或其他非串值字符补全
例题
给定一个字符串,逐个翻转字符串中的每个单词。例如,输入: "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()+" ");
}
}
}