ホームページ よくある問題 文字列は特別なデータ オブジェクトと操作を含む線形リストですか?

文字列は特別なデータ オブジェクトと操作を含む線形リストですか?

Feb 03, 2021 am 11:14 AM
データ構造

はい、文字列は特別なデータ オブジェクトと操作を含む線形リスト構造です。データ構造で言及される文字列は文字列であり、文字列内の文字には「1 対 1」の論理関係があるため、厳密に言えば、文字列の記憶構造は線形記憶構造です。

文字列は特別なデータ オブジェクトと操作を含む線形リストですか?

このチュートリアルの動作環境: Windows 7 システム、Dell G3 コンピューター。

データ構造で言及される文字列、つまり文字列は、n 個の文字 (n >= 0) から構成される全体です。これらの n 文字は、文字、数字、またはその他の文字で構成できます。

データ構造では、文字列は文字列記憶構造と呼ばれる別の記憶構造に保存する必要があります。

厳密に言えば、文字列内の文字には「1 対 1」の論理関係があるため、文字列の記憶構造も線形記憶構造です。ただし、前に学習した線形ストレージ構造とは異なり、文字列構造は文字型データを格納するためにのみ使用されます。

#特別な文字列

  • 空の文字列: ゼロ文字を含む文字列。例: S = "" (二重引用符で囲まれたものは何もありません)。通常は Ø として直接表現されます。

  • スペース文字列: スペースのみを含む文字列。空の文字列とは異なることに注意してください。スペース文字列には内容がありますが、スペースが含まれており、スペース文字列には複数のスペースを含めることができます。たとえば、a = " " (スペースが 3 つ含まれます)。

  • サブ文字列とメイン文字列: 文字列内の連続する文字で構成される文字列は、文字列のサブ文字列と呼ばれ、サブ文字列を含む文字列はメイン文字列と呼ばれます。

例: a = "BEI"、b = "BEIJING"、c = "BJINGEI"。文字列 a と b の場合、b には連続文字列 a,

が含まれているため、a は b の部分文字列、b は a の主文字列であると言えます。また、c と a については、c ですが、また、a のすべての文字が含まれていますが、連続する "BEI" は含まれていないため、文字列 c は a と関係がありません。

メイン文字列内のサブ文字列の位置: 文字列 a = "BEI" の場合、文字列 b の最初の文字 'B' の位置は 1 であるため、メイン文字列内のサブ文字列 a の位置b = 「BEIJING」の位置は 1 です。

主文字列内の部分文字列の位置は、配列内の文字の格納位置と異なります。主文字列内の部分文字列の位置は 1 から始まります。

2 つの文字列の等価性の標準: 2 つの文字列の文字列値がまったく同じである場合、2 つの文字列は等しいです。

#文字列の保存には 3 つの保存構造があります#文字列の保存には 3 つの構造があります:

1 固定長シーケンシャル ストレージ;

2 ヒープ割り当てストレージ;

3 ブロック チェーン ストレージ。

固定長シーケンシャルストレージ

固定長配列 (静的配列) を使用して文字列を保存します。

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

この方法で文字列を保存する場合は、文字列の長さを見積もり、事前に十分な保存領域を申請する必要があります。 。ターゲット文字列が配列で要求された長さを超える場合、超過部分は自動的に破棄されます (「切り捨て」と呼ばれます)。

例: char a[3] = "abcdfg";//実際には、配列には「abc」のみが格納され、それ以降は切り捨てられます。ヒープ割り当てストレージ

動的配列を使用して文字列を格納します

C 言語では、malloc 関数と Free 関数管理を使用して「ヒープ」と呼ばれる空き記憶領域があります。 , malloc 関数はスペースの申請を担当し、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 のポインティングが変更されており、つまり、以前に動的に申請された記憶域が、使用される前に失われています。

ブロック チェーン ストレージ

ブロック チェーン ストレージは、実際にはリンク リストのストレージ構造を借用して文字列を保存します。通常の状況では、単一のリンク リストを使用するだけで十分であり、ヘッド ノードを追加する必要はありません。

リンク リストを作成する場合、各ノードは 1 文字または複数の文字を保存できます。

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

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

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

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

总结

在平时编写程序,经常会用到例如: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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java 関数比較を使用して複雑なデータ構造を比較する Java 関数比較を使用して複雑なデータ構造を比較する Apr 19, 2024 pm 10:24 PM

Java で複雑なデータ構造を使用する場合、Comparator を使用して柔軟な比較メカニズムを提供します。具体的な手順には、コンパレータ クラスの定義、比較ロジックを定義するための比較メソッドの書き換えが含まれます。コンパレータインスタンスを作成します。 Collections.sort メソッドを使用して、コレクションとコンパレータのインスタンスを渡します。

Javaのデータ構造とアルゴリズム: 詳細な説明 Javaのデータ構造とアルゴリズム: 詳細な説明 May 08, 2024 pm 10:12 PM

データ構造とアルゴリズムは Java 開発の基礎です。この記事では、Java の主要なデータ構造 (配列、リンク リスト、ツリーなど) とアルゴリズム (並べ替え、検索、グラフ アルゴリズムなど) について詳しく説明します。これらの構造は、スコアを保存するための配列、買い物リストを管理するためのリンク リスト、再帰を実装するためのスタック、スレッドを同期するためのキュー、高速検索と認証のためのツリーとハッシュ テーブルの使用など、実際の例を通じて説明されています。これらの概念を理解すると、効率的で保守しやすい Java コードを作成できるようになります。

Go 言語の参照型についての深い理解 Go 言語の参照型についての深い理解 Feb 21, 2024 pm 11:36 PM

参照型は Go 言語の特別なデータ型であり、その値にはデータそのものが直接格納されるのではなく、格納されたデータのアドレスが格納されます。 Go 言語では、参照型にはスライス、マップ、チャネル、ポインターが含まれます。 Go 言語のメモリ管理とデータ転送方法を理解するには、参照型を深く理解することが重要です。この記事では具体的なコード例を組み合わせて、Go言語における参照型の特徴と使い方を紹介します。 1. スライス スライスは、Go 言語で最も一般的に使用される参照型の 1 つです。

PHP データ構造: AVL ツリーのバランス、効率的で秩序あるデータ構造の維持 PHP データ構造: AVL ツリーのバランス、効率的で秩序あるデータ構造の維持 Jun 03, 2024 am 09:58 AM

AVL ツリーは、高速かつ効率的なデータ操作を保証するバランスのとれた二分探索ツリーです。バランスを達成するために、左回転と右回転の操作を実行し、バランスに反するサブツリーを調整します。 AVL ツリーは高さバランシングを利用して、ツリーの高さがノード数に対して常に小さくなるようにすることで、対数時間計算量 (O(logn)) の検索操作を実現し、大規模なデータ セットでもデータ構造の効率を維持します。

Java コレクション フレームワークの完全分析: データ構造を分析し、効率的なストレージの秘密を明らかにする Java コレクション フレームワークの完全分析: データ構造を分析し、効率的なストレージの秘密を明らかにする Feb 23, 2024 am 10:49 AM

Java コレクション フレームワークの概要 Java コレクション フレームワークは Java プログラミング言語の重要な部分であり、データを保存および管理できる一連のコンテナ クラス ライブラリを提供します。これらのコンテナ クラス ライブラリには、さまざまなシナリオでのデータ ストレージと処理のニーズを満たすために、さまざまなデータ構造があります。コレクション フレームワークの利点は、統一されたインターフェイスが提供され、開発者が異なるコンテナ クラス ライブラリを同じ方法で操作できるため、開発の困難さが軽減されることです。 Java コレクション フレームワークのデータ構造 Java コレクション フレームワークにはさまざまなデータ構造が含まれており、それぞれに独自の特性と適用可能なシナリオがあります。以下に、一般的な Java コレクション フレームワークのデータ構造をいくつか示します。 1. リスト: リストは、要素を繰り返すことができる順序付けされたコレクションです。李

PHP SPL データ構造: プロジェクトにスピードと柔軟性をもたらします PHP SPL データ構造: プロジェクトにスピードと柔軟性をもたらします Feb 19, 2024 pm 11:00 PM

PHPSPL データ構造ライブラリの概要 PHPSPL (標準 PHP ライブラリ) データ構造ライブラリには、さまざまなデータ構造を保存および操作するためのクラスとインターフェイスのセットが含まれています。これらのデータ構造には、配列、リンク リスト、スタック、キュー、セットが含まれており、それぞれがデータを操作するためのメソッドとプロパティの特定のセットを提供します。配列 PHP では、配列は一連の要素を格納する順序付けされたコレクションです。 SPL 配列クラスは、ソート、フィルタリング、マッピングなどのネイティブ PHP 配列の拡張機能を提供します。 SPL 配列クラスの使用例を次に示します。 useSplArrayObject;$array=newArrayObject(["foo","bar","baz"]);$array

ハッシュ テーブル ベースのデータ構造により、PHP 配列の論理積と和集合の計算が最適化されます。 ハッシュ テーブル ベースのデータ構造により、PHP 配列の論理積と和集合の計算が最適化されます。 May 02, 2024 pm 12:06 PM

ハッシュ テーブルを使用すると、PHP 配列の交差と和集合の計算を最適化し、時間の複雑さを O(n*m) から O(n+m) に減らすことができます。 具体的な手順は次のとおりです。 ハッシュ テーブルを使用して要素をマップします。最初の配列をブール値に変換すると、2 番目の配列の要素が存在するかどうかがすぐにわかり、交差計算の効率が向上します。ハッシュ テーブルを使用して最初の配列の要素を既存としてマークし、次に 2 番目の配列の要素を 1 つずつ追加し、既存の要素を無視して共用体計算の効率を向上させます。

Go 言語のデータ構造の秘密を詳しく学ぶ Go 言語のデータ構造の秘密を詳しく学ぶ Mar 29, 2024 pm 12:42 PM

Go 言語のデータ構造の謎を深く研究するには、具体的なコード例が必要ですが、簡潔で効率的なプログラミング言語である Go 言語は、データ構造の処理においても独特の魅力を発揮します。データ構造はコンピューター サイエンスの基本概念であり、より効率的にアクセスして操作できるようにデータを整理および管理することを目的としています。 Go 言語のデータ構造の謎を深く学ぶことで、データがどのように保存され操作されるかをより深く理解できるようになり、それによってプログラミングの効率とコードの品質が向上します。 1. 配列 配列は最も単純なデータ構造の 1 つです