>일반적인 문제 >문자열은 특수한 데이터 개체와 연산이 포함된 선형 목록인가요?

문자열은 특수한 데이터 개체와 연산이 포함된 선형 목록인가요?

青灯夜游
青灯夜游원래의
2021-02-03 11:14:5712426검색

예, 문자열은 특수 데이터 개체와 작업이 포함된 선형 목록 구조입니다. 데이터 구조에 언급된 문자열은 문자열입니다. 문자열의 문자는 "일대일" 논리적 관계를 가지므로 엄밀히 말하면 문자열 저장 구조는 선형 저장 구조입니다.

문자열은 특수한 데이터 개체와 연산이 포함된 선형 목록인가요?

이 튜토리얼의 운영 환경: Windows 7 시스템, Dell G3 컴퓨터.

데이터 구조에 언급된 문자열, 즉 문자열은 n개의 문자(n>=0)로 이루어진 전체입니다. 이러한 n개의 문자는 문자, 숫자 또는 기타 문자로 구성될 수 있습니다.

데이터 구조에서 문자열은 문자열 저장 구조라고 불리는 별도의 저장 구조에 저장되어야 합니다.

엄밀히 말하면 문자열 저장 구조도 선형 저장 구조입니다. 문자열의 문자도 "일대일" 논리적 관계를 갖기 때문입니다. 하지만 앞서 배운 선형 저장 구조와 달리 문자열 구조는 문자형 데이터를 저장하는 데에만 사용됩니다.

특수 문자열

  • 빈 문자열: 0개의 문자가 포함된 문자열입니다. 예: S = ""(큰따옴표 안의 항목 없음), 일반적으로 직접 Ø로 표시됩니다.

  • 공백 문자열: 공백만 포함하는 문자열입니다. 공백 문자열에는 내용이 있지만 공백이 포함되어 있으며 공백 문자열에는 공백이 여러 개 포함될 수 있습니다. 예를 들어, a = " "(공백 3개 포함)입니다.

  • 하위 문자열 및 기본 문자열: 문자열의 연속 문자로 구성된 문자열을 문자열의 하위 문자열이라고 하며, 하위 문자열을 포함하는 문자열을 기본 문자열이라고 합니다.

예: a = "BEI", b = "BEIJING", c = "BJINGEI". 문자열 a와 b의 경우 b에는 연속 문자열 a

가 포함되어 있으므로 a는 b의 하위 문자열이고 b는 a의 주 문자열이라고 할 수 있습니다. c와 a의 경우 c에도 All이 포함되어 있습니다. 문자이지만 연속적인 "BEI"는 아니므로 문자열 c와 a는 관계가 없습니다.

주 문자열에서 하위 문자열의 위치: 문자열 a = "BEI"의 경우 문자열 b에서 첫 번째 문자 'B'의 위치는 1이므로 주 문자열 b = "BEIJING"에서 하위 문자열 a의 위치는 다음과 같습니다. 1.

기본 문자열의 하위 문자열 위치는 배열의 문자 저장 위치와 다릅니다. 기본 문자열의 하위 문자열 위치는 1부터 시작됩니다.

두 문자열의 동등 기준: 두 문자열의 문자열 값이 정확히 동일하면 두 문자열은 같습니다.

3가지 문자열 저장 구조 문자열에는 3가지 저장 구조가 있습니다:

1 고정 길이 순차 저장

2 힙 할당 저장

3 블록체인 저장.

고정 길이 순차 저장소

고정 길이 배열(즉, 정적 배열)을 사용하여 문자열을 저장하세요.

예: char a[7] = "abcdfg";

이런 방식으로 문자열을 저장할 때는 문자열의 길이를 미리 추정하고 충분한 저장 공간을 신청해야 합니다. 대상 문자열이 배열에서 요청한 길이를 초과하는 경우 초과 부분은 자동으로 삭제됩니다("잘림"이라고 함).

예: char a[3] = "abcdfg";//실제로는 "abc"만 배열에 저장되고 다음은 잘립니다. 힙 할당 저장소

동적 배열을 사용하여 문자열을 저장합니다

C 언어에는 "heap"이라는 무료 저장 영역이 있는데, 이는 malloc 함수와 free 함수에 의해 관리됩니다. space, 그리고 free 함수는 공간 확보를 담당합니다.

예:

char * a = (char*)malloc(5*sizeof(char));//创建 a 数组,动态申请5个 char 类型数据的存储空间

힙 할당 저장소 사용의 장점은 적용한 공간이 부족하다고 판단될 경우 realloc() 함수를 통해 더 큰 저장 공간을 다시 신청할 수 있다는 것입니다.

例如:a = (char*)realloc(a, 10*sizeof(char));//前一个参数指申请空间的对象;第二个参数,重新申请空间的大小

malloc 함수 사용 시 적용된 저장 공간은 자동으로 해제되지 않으며, 프로그래머가 free() 함수를 호출하여 수동으로 해제해야 합니다. 수동으로 해제하지 않으면 프로그램 실행이 완전히 완료된 후 운영 체제에 의해 재활용됩니다.

例如:free(a);//释放动态数组a申请的空间

완전한 예를 들자면 연결 문자열 "abc"와 "defg"는 "abcdefg"가 됩니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char * a1=NULL;
    char * a2=NULL;
    
    a1=(char*)malloc(3*sizeof(char));
    strcpy(a1, "abc");//将字符串“abc”复制给a1
    
    a2=(char*)malloc(3*sizeof(char));
    strcpy(a2, "defg");
    
    int lengthA1=strlen(a1);
    int lengthA2=strlen(a2);
    if (lengthA1<lengthA1+lengthA2) {
        a1=(char*)realloc(a1, (lengthA1+lengthA2)*sizeof(char));
    }
    int i;
    for (i=lengthA1; i<lengthA1+lengthA2; i++) {
        a1[i]=a2[i-lengthA1];
    }
    printf("%s",a1);
    
    free(a1);
    free(a2);
    return 0;
}

참고: 프로그램에서 a1과 a2에 값을 할당할 때 strcpy 복사 기능 . 여기에서는 직접 사용할 수 없습니다: a1 = "abc".

이렇게 하면 프로그램이 오류와 함께 컴파일되어 malloc이 없는 공간을 해제할 수 없다는 메시지가 나타납니다. 문자열은 특수한 데이터 개체와 연산이 포함된 선형 목록인가요?

이유는 다음과 같습니다. strcpy 함수는 문자열을 요청한 저장 공간에 복사하는 반면, 직접 할당은 문자열이 다른 메모리 공간(자체는 상수, 상수 영역에 배치됨)에 저장됨을 의미합니다.

포인터 a1과 a2점은 즉, 이전에 동적으로 신청한 저장공간을 신청했지만, 사용되기 전에 소멸된다는 점이다.

블록체인 저장소

블록체인 저장소는 실제로 연결 목록의 저장소 구조를 빌려 문자열을 저장합니다. 일반적인 상황에서는 단일 연결 목록을 사용하면 충분하며 헤드 노드를 추가할 필요가 없습니다.

연결된 목록을 작성할 때 각 노드는 한 문자 또는 여러 문자를 저장할 수 있습니다.

链表中最后一个结点的数据域不一定全被串值占满,通常会补上 “#” 或者其他特殊的字符和字符串中的字符区分开。

每个结点设置字符数量的多少和存储的串的长度、可以占用的存储空间以及程序实现的功能相关。

如果串包含数据量很大,但是可用的存储空间有限,那么就需要提高空间利用率,相应地减少结点数量(因为多一个节点,就多申请一个指针域的空间)。

而如果程序中需要大量地插入或者删除数据,如果每个节点包含的字符过多,操作字符就会变得很麻烦,为实现功能增加了障碍。

总结

在平时编写程序,经常会用到例如:char *a = ”abcd”;这种方式表示字符串,和上面三种存储方式最主要的区别是:这种方式用于表示常量字符串,只能使用,不能对字符串内容做修改(否则程序运行出错);而以上三种方式都可以对字符串进行删改的操作。

例如:

#include <stdio.h>
int main() {
    char* a="abcd";
    a[1]=&#39;b&#39;;
    return 0;
}

程序编译可以通过,运行失败,改成下面堆分配存储的方式就对了:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char * a=(char*)malloc(4*sizeof(char));
    strcpy(a, "abcd");
    a[1]=&#39;e&#39;;
    printf("%s",a);
    return 0;
}

문자열은 특수한 데이터 개체와 연산이 포함된 선형 목록인가요?

三种存储表示方式中,最常用的是堆分配存储,因为它在定长存储的基础上通过使用动态数组,避免了在操作串时可能因为申请存储空间的不足而丢失字符数据;和块链存储方式相比,结构相对简单,更容易操作。

更多计算机编程相关知识,请访问:编程视频!!

위 내용은 문자열은 특수한 데이터 개체와 연산이 포함된 선형 목록인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.