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()+" ");
		}

	}

}

posted @ 2020-10-23 17:05  Nixon  阅读(138)  评论(0编辑  收藏  举报