Heim häufiges Problem Ist ein String eine lineare Liste mit speziellen Datenobjekten und Operationen?

Ist ein String eine lineare Liste mit speziellen Datenobjekten und Operationen?

Feb 03, 2021 am 11:14 AM
数据结构

Ja, String ist eine lineare Listenstruktur mit speziellen Datenobjekten und Operationen. Die in der Datenstruktur erwähnte Zeichenfolge ist eine Zeichenfolge. Die Zeichen in der Zeichenfolge stehen in einer logischen Eins-zu-Eins-Beziehung, sodass die Zeichenfolgenspeicherstruktur streng genommen eine lineare Speicherstruktur ist.

Ist ein String eine lineare Liste mit speziellen Datenobjekten und Operationen?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, Dell G3-Computer.

Die in der Datenstruktur erwähnte Zeichenfolge, also eine Zeichenfolge, besteht aus n Zeichen (n > = 0). Diese n Zeichen können aus Buchstaben, Zahlen oder anderen Zeichen bestehen.

In der Datenstruktur müssen Zeichenfolgen in einer separaten Speicherstruktur gespeichert werden, die als Zeichenfolgenspeicherstruktur bezeichnet wird.

Genau genommen handelt es sich bei der Zeichenfolgenspeicherstruktur auch um eine lineare Speicherstruktur, da die Zeichen in der Zeichenfolge ebenfalls eine logische Eins-zu-Eins-Beziehung haben. Im Gegensatz zur linearen Speicherstruktur, die wir zuvor kennengelernt haben, wird die Zeichenfolgenstruktur jedoch nur zum Speichern von Zeichentypdaten verwendet.

Spezielle Zeichenfolgen

  • Leere Zeichenfolge: Eine Zeichenfolge, die null Zeichen enthält. Zum Beispiel: S = „“ (nichts in doppelten Anführungszeichen), normalerweise direkt ausgedrückt als Ø.

  • Leerzeichenfolge: Eine Zeichenfolge, die nur Leerzeichen enthält. Beachten Sie, dass es sich von der Leerzeichenfolge unterscheidet. Die Leerzeichenzeichenfolge enthält zwar Inhalt, enthält jedoch Leerzeichen, und die Leerzeichenzeichenfolge kann mehrere Leerzeichen enthalten. Beispiel: a = „ “ (enthält 3 Leerzeichen).

  • Teilzeichenfolge und Hauptzeichenfolge: Eine Zeichenfolge, die aus beliebigen aufeinanderfolgenden Zeichen in der Zeichenfolge besteht, wird als Teilzeichenfolge der Zeichenfolge bezeichnet, und die Zeichenfolge, die die Teilzeichenfolge enthält, wird als Hauptzeichenfolge bezeichnet.

Zum Beispiel: a = „BEI“, b = „PEIJING“, c = „BJINGEI“. Für die Zeichenfolgen a und b kann gesagt werden, dass a eine Teilzeichenfolge von b und b die Hauptzeichenfolge von a ist, da b die fortlaufende Zeichenfolge a enthält Zeichen, aber nicht aufeinanderfolgende „BEI“, daher haben die Zeichenfolgen c und a keine Beziehung.

Die Position der Teilzeichenfolge in der Hauptzeichenfolge: Für Zeichenfolge a = „BEI“ ist die Position des ersten Zeichens „B“ in Zeichenfolge b 1, sodass die Position von Teilzeichenfolge a in Hauptzeichenfolge b = „PEIJING“ lautet 1.

Die Position der Teilzeichenfolge in der Hauptzeichenfolge unterscheidet sich von der Speicherposition der Zeichen im Array. Die Position der Teilzeichenfolge in der Hauptzeichenfolge beginnt bei 1.

Kriterien für die Gleichheit zweier Strings: Wenn die Stringwerte zweier Strings genau gleich sind, dann sind die beiden Strings gleich.

Drei Speicherstrukturen für Strings Es gibt drei Speicherstrukturen für Strings: 1 sequenzieller Speicher mit fester Länge;

2 Heap-Zuordnungsspeicher;

3 Blockkettenspeicher.

Sequentielle Speicherung fester Länge

Verwenden Sie Arrays fester Länge (d. h. statische Arrays), um Zeichenfolgen zu speichern.

Zum Beispiel: char a[7] = "abcdfg";

Wenn Sie Zeichenfolgen auf diese Weise speichern, müssen Sie die Länge der Zeichenfolge schätzen und im Voraus ausreichend Speicherplatz beantragen. Wenn die Zielzeichenfolge die vom Array angeforderte Länge überschreitet, wird der überschüssige Teil automatisch verworfen (sogenannte „Trunkierung“).

Zum Beispiel: char a[3] = "abcdfg";// Tatsächlich wird nur „abc“ im Array gespeichert und die folgenden werden abgeschnitten. Heap-zugewiesener Speicher

verwendet dynamische Arrays zum Speichern von Zeichenfolgen

In der C-Sprache gibt es einen freien Speicherbereich namens „Heap“, der von der malloc-Funktion verwaltet wird und für dessen Beantragung die freie Funktion verantwortlich ist Speicherplatz und die Freifunktion Verantwortlich für die Freigabe von Speicherplatz.

Zum Beispiel:

char * a = (char*)malloc(5*sizeof(char));//创建 a 数组,动态申请5个 char 类型数据的存储空间
Nach dem Login kopieren
Der Vorteil der Verwendung von Heap-Zuweisungsspeicher besteht darin, dass Sie, wenn Sie feststellen, dass der zugewiesene Speicherplatz nicht ausreicht, über die Funktion realloc() erneut größeren Speicherplatz beantragen können.
例如:a = (char*)realloc(a, 10*sizeof(char));//前一个参数指申请空间的对象;第二个参数,重新申请空间的大小
Nach dem Login kopieren

Der für die Verwendung der malloc-Funktion beantragte Speicherplatz wird nicht automatisch freigegeben, und der Programmierer muss die Funktion free() aufrufen, um ihn manuell freizugeben. Wenn es nicht manuell freigegeben wird, wird es vom Betriebssystem wiederverwendet, wenn die Programmausführung vollständig abgeschlossen ist.

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

Um ein vollständiges Beispiel zu geben: Die Verbindungszeichenfolgen „abc“ und „defg“ werden zu „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;
}
Nach dem Login kopieren

Hinweis: Wenn wir im Programm a1 und a2 Werte zuweisen, verwenden wir die strcpy-Kopierfunktion. Sie können es hier nicht direkt verwenden: a1 = „abc“.

Wenn Sie dies tun, wird das Programm mit einer Fehlermeldung kompiliert, die Ihnen mitteilt, dass Speicherplatz ohne malloc nicht freigegeben werden kann.

Der Grund ist: Die Funktion strcpy kopiert den String in den angeforderten Speicherplatz, während die direkte Zuweisung bedeutet, dass der String in einem anderen Speicherplatz gespeichert wird (selbst eine Konstante, im Konstantenbereich platziert), Ist ein String eine lineare Liste mit speziellen Datenobjekten und Operationen?

ändert den Zeiger a1 und den Punkt a2, d. h. der vor der Beantragung dynamisch beantragte Speicherplatz ging vor der Nutzung zwar verloren.

Blockchain-Speicher

Blockchain-Speicher leiht sich tatsächlich die Speicherstruktur einer verknüpften Liste, um Zeichenfolgen zu speichern. Unter normalen Umständen reicht es aus, eine einzelne verknüpfte Liste zu verwenden, und es ist nicht erforderlich, einen Kopfknoten hinzuzufügen.

Beim Erstellen einer verknüpften Liste kann jeder Knoten ein Zeichen oder mehrere Zeichen speichern.

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

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

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

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

总结

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

例如:

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

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

#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;
}
Nach dem Login kopieren

Ist ein String eine lineare Liste mit speziellen Datenobjekten und Operationen?

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

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

Das obige ist der detaillierte Inhalt vonIst ein String eine lineare Liste mit speziellen Datenobjekten und Operationen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Vergleichen Sie komplexe Datenstrukturen mithilfe des Java-Funktionsvergleichs Vergleichen Sie komplexe Datenstrukturen mithilfe des Java-Funktionsvergleichs Apr 19, 2024 pm 10:24 PM

Bei der Verwendung komplexer Datenstrukturen in Java wird Comparator verwendet, um einen flexiblen Vergleichsmechanismus bereitzustellen. Zu den spezifischen Schritten gehören: Definieren einer Komparatorklasse und Umschreiben der Vergleichsmethode, um die Vergleichslogik zu definieren. Erstellen Sie eine Komparatorinstanz. Verwenden Sie die Methode „Collections.sort“ und übergeben Sie die Sammlungs- und Komparatorinstanzen.

Java-Datenstrukturen und -Algorithmen: ausführliche Erklärung Java-Datenstrukturen und -Algorithmen: ausführliche Erklärung May 08, 2024 pm 10:12 PM

Datenstrukturen und Algorithmen sind die Grundlage der Java-Entwicklung. In diesem Artikel werden die wichtigsten Datenstrukturen (wie Arrays, verknüpfte Listen, Bäume usw.) und Algorithmen (wie Sortier-, Such-, Diagrammalgorithmen usw.) ausführlich untersucht. Diese Strukturen werden anhand praktischer Beispiele veranschaulicht, darunter die Verwendung von Arrays zum Speichern von Bewertungen, verknüpfte Listen zum Verwalten von Einkaufslisten, Stapel zum Implementieren von Rekursionen, Warteschlangen zum Synchronisieren von Threads sowie Bäume und Hash-Tabellen für schnelle Suche und Authentifizierung. Wenn Sie diese Konzepte verstehen, können Sie effizienten und wartbaren Java-Code schreiben.

Vertieftes Verständnis der Referenztypen in der Go-Sprache Vertieftes Verständnis der Referenztypen in der Go-Sprache Feb 21, 2024 pm 11:36 PM

Referenztypen sind ein spezieller Datentyp in der Go-Sprache. Ihre Werte speichern nicht direkt die Daten selbst, sondern die Adresse der gespeicherten Daten. In der Go-Sprache umfassen Referenztypen Slices, Karten, Kanäle und Zeiger. Ein tiefes Verständnis der Referenztypen ist entscheidend für das Verständnis der Speicherverwaltungs- und Datenübertragungsmethoden der Go-Sprache. In diesem Artikel werden spezifische Codebeispiele kombiniert, um die Merkmale und Verwendung von Referenztypen in der Go-Sprache vorzustellen. 1. Slices Slices sind einer der am häufigsten verwendeten Referenztypen in der Go-Sprache.

PHP-Datenstruktur: Das Gleichgewicht der AVL-Bäume sorgt für eine effiziente und geordnete Datenstruktur PHP-Datenstruktur: Das Gleichgewicht der AVL-Bäume sorgt für eine effiziente und geordnete Datenstruktur Jun 03, 2024 am 09:58 AM

Der AVL-Baum ist ein ausgewogener binärer Suchbaum, der schnelle und effiziente Datenoperationen gewährleistet. Um ein Gleichgewicht zu erreichen, führt es Links- und Rechtsdrehungen durch und passt Teilbäume an, die das Gleichgewicht verletzen. AVL-Bäume nutzen den Höhenausgleich, um sicherzustellen, dass die Höhe des Baums im Verhältnis zur Anzahl der Knoten immer klein ist, wodurch Suchoperationen mit logarithmischer Zeitkomplexität (O(logn)) erreicht werden und die Effizienz der Datenstruktur auch bei großen Datensätzen erhalten bleibt.

Vollständige Analyse des Java-Sammlungsframeworks: Analyse der Datenstruktur und Enthüllung des Geheimnisses effizienter Speicherung Vollständige Analyse des Java-Sammlungsframeworks: Analyse der Datenstruktur und Enthüllung des Geheimnisses effizienter Speicherung Feb 23, 2024 am 10:49 AM

Überblick über das Java Collection Framework Das Java Collection Framework ist ein wichtiger Teil der Programmiersprache Java. Es stellt eine Reihe von Containerklassenbibliotheken bereit, die Daten speichern und verwalten können. Diese Containerklassenbibliotheken verfügen über unterschiedliche Datenstrukturen, um den Datenspeicher- und -verarbeitungsanforderungen in verschiedenen Szenarien gerecht zu werden. Der Vorteil des Sammlungsframeworks besteht darin, dass es eine einheitliche Schnittstelle bietet, die es Entwicklern ermöglicht, verschiedene Containerklassenbibliotheken auf die gleiche Weise zu betreiben, wodurch die Entwicklungsschwierigkeiten verringert werden. Datenstrukturen des Java-Sammlungsframeworks Das Java-Sammlungsframework enthält eine Vielzahl von Datenstrukturen, von denen jede ihre eigenen einzigartigen Eigenschaften und anwendbaren Szenarien aufweist. Im Folgenden sind einige gängige Datenstrukturen des Java Collection Frameworks aufgeführt: 1. Liste: Liste ist eine geordnete Sammlung, die die Wiederholung von Elementen ermöglicht. Li

PHP-SPL-Datenstrukturen: Bringen Sie Geschwindigkeit und Flexibilität in Ihre Projekte PHP-SPL-Datenstrukturen: Bringen Sie Geschwindigkeit und Flexibilität in Ihre Projekte Feb 19, 2024 pm 11:00 PM

Überblick über die PHPSPL-Datenstrukturbibliothek Die PHPSPL-Datenstrukturbibliothek (Standard PHP Library) enthält eine Reihe von Klassen und Schnittstellen zum Speichern und Bearbeiten verschiedener Datenstrukturen. Zu diesen Datenstrukturen gehören Arrays, verknüpfte Listen, Stapel, Warteschlangen und Mengen, von denen jede einen bestimmten Satz von Methoden und Eigenschaften zum Bearbeiten von Daten bereitstellt. Arrays In PHP ist ein Array eine geordnete Sammlung, die eine Folge von Elementen speichert. Die SPL-Array-Klasse bietet erweiterte Funktionen für native PHP-Arrays, einschließlich Sortierung, Filterung und Zuordnung. Hier ist ein Beispiel für die Verwendung der SPL-Array-Klasse: useSplArrayObject;$array=newArrayObject(["foo","bar","baz"]);$array

Die auf Hash-Tabellen basierende Datenstruktur optimiert die Schnitt- und Vereinigungsberechnungen von PHP-Arrays Die auf Hash-Tabellen basierende Datenstruktur optimiert die Schnitt- und Vereinigungsberechnungen von PHP-Arrays May 02, 2024 pm 12:06 PM

Die Hash-Tabelle kann zur Optimierung von PHP-Array-Schnittpunkt- und Vereinigungsberechnungen verwendet werden, wodurch die Zeitkomplexität von O(n*m) auf O(n+m) reduziert wird. Die spezifischen Schritte sind wie folgt: Verwenden Sie eine Hash-Tabelle, um die Elemente von zuzuordnen Wandeln Sie das erste Array in einen booleschen Wert um, um schnell herauszufinden, ob das Element im zweiten Array vorhanden ist, und um die Effizienz der Schnittpunktberechnung zu verbessern. Verwenden Sie eine Hash-Tabelle, um die Elemente des ersten Arrays als vorhanden zu markieren, und fügen Sie dann die Elemente des zweiten Arrays nacheinander hinzu, wobei Sie vorhandene Elemente ignorieren, um die Effizienz der Vereinigungsberechnungen zu verbessern.

Lernen Sie die Geheimnisse der Datenstrukturen der Go-Sprache ausführlich kennen Lernen Sie die Geheimnisse der Datenstrukturen der Go-Sprache ausführlich kennen Mar 29, 2024 pm 12:42 PM

Eine eingehende Untersuchung der Geheimnisse der Datenstruktur der Go-Sprache erfordert spezifische Codebeispiele. Als prägnante und effiziente Programmiersprache zeigt die Go-Sprache auch ihren einzigartigen Charme bei der Verarbeitung von Datenstrukturen. Datenstruktur ist ein Grundkonzept der Informatik, das darauf abzielt, Daten so zu organisieren und zu verwalten, dass sie effizienter abgerufen und bearbeitet werden können. Indem wir uns eingehend mit den Geheimnissen der Datenstruktur der Go-Sprache befassen, können wir besser verstehen, wie Daten gespeichert und verarbeitet werden, und so die Programmiereffizienz und Codequalität verbessern. 1. Array Array ist eine der einfachsten Datenstrukturen