1. 程式人生 > >資料結構之串的定義及實現

資料結構之串的定義及實現

串的基本定義及實現

  • 串型別的定義
  • 定長順序儲存形式
  • 堆分配儲存形式
    1.1、串型別的定義
    (string)是零個或多個字元組成的有限序列 , S=‘a1a2…an’(n>=0)
    其中,s是串名,用單引號括起來的是串的值;ai是字母、數字或其他字元;傳中字元的數目n稱為串的長度。另個字元的串稱為空串,它的長度為0。
    串中一個連續的字元組成的子序列稱為該串的子串。包含子串的串稱為主串。通常稱字元在序列中的序號為在串中位置。子串在主串中的位置則以子串的第一個字元在主串中的位置來表示。
    1.2幾種對比
    1.棧和佇列是操作受限的線性表,是取值受限的線性表,約束為字符集。
    2.空格串:由一個或多個空格組成的串,空串
    :零個字元的串稱為空串
    3.串的邏輯結構和線性表很相似區別僅在於串的資料物件為字符集。然而,串的基本操作和線性表有很大差別。線性表通常操作物件為單個字元,而串的操作物件為一個子串。
    2定長順序儲存形式
    2.1順序儲存表示
	#define MAXSIZE 300
	typdef char str[MAXSIZE+1];

2.2賦值

void StrAssign(str s,char ch[]){
	int a,i;
	if((a=strlen(ch)>MAXSIZE)//判斷是否ch的長度大於最大值
		exit(-1);
	for(i=1;i<a;i++){//進行值拷貝
		s[i]=ch[i];
	s[0]=ch[0];//第一個字元存長度
}

2.3拷貝

void strcopy(str s,str ss){
	if(ss[0]>s[0]){
		printf("記憶體不足");
		exit(-1);
	}
	for(int i=0;i<=ss[0];i++)//一個字元一個字元拷貝
		s[i]=ss[i];
	s[0]+=ss[0];
}

2.4判斷是否為空

int strempty(str s){//為空返回1,否則返回0
	if(s[0]==0)
		return 1;
	else
	return 0;
}

2.5比較大小

int strcompare(str s,str t){
	for(int i=0;i<s[0]&&i<t[0];i++){
		if(s[i]!=t[i])
			return s[i]-t[i];//返回不相等時的字元的大小
	}
	return s[0]-t[0];//某個串結束,前面都相等,返回串長的大小
}

2.6求長度

int strlength(str s){
	return s[0];
}

2.7連線兩個串

int strcat(str s,str t){//全部連線
	if(s[0]+t[0]<=MAXSIZE){
		for(int i=1;i<=t[0];i++)
			s[s[0]+i]=t[i];
		s[0]+=t[0];
	}
	else{//連線部分
		if(s[0]==MAXSIZE)
			return 0;
		for(int i=1;i<=MAXSIZE-s[0]-1;i++)
			s[s[0]+i)=t[i];
		s[0]+=t[0];
	}
}

2.8找到主串中在第pos個字元之後的len個字元

void substring(str s,str n,int pos,int len){
	if(pos<1||pos>s[0]||pos>s[0]-len-1||len<0)
		exit(-1);
	for(int i=1;i<len;i++)
		n[i]=s[i+pos-1];
	n[0]=len;
}

2.9主串中找到與串在POS位置之後相等的子串

int index(str s,str t,int pos){
	if(pos<0||pos>s[0])
		return 0;
	int i=pos;
	int j=1;
	while(i<=s[0]&&j<=t[0]){
		if(s[i]==t[j]){//如果相等,則進行下一個字元對比
			++i;
			++j;
		}
		else{//如果不相等,主串的跳到不相等之前那個位置,重新開始對比
			i=i-j+2;
			j=1;	
		}
	}
	if(j>t[0])
	return i-t[0];
}

2.10在主串位置 pos之後插入一個串

void strinsert(str s,str t,int pos){
	if(pos<0||pos>s[0]+1)
		exit(-1);
	if(s[0]+t[0]<=MAXSIZE){//全部插入
		for(int i=s[0];i>=pos;i--){//移動之後再插入
			s[i+t[0]]=s[i];
		}
		for(i=pos;i<pos+t[0];i++){
			s[i]=t[pos-i+1];
		}
		s[0]+=t[0];
	else{//部分插入
		for(i=MAXSIZE;i>=pos+t[0];i--){
			s[i]=s[i-t[0]];
		}
		for(i=pos;i<pos+t[0]||i<=MAXSIZE;i++)
		s[i]=t[i-pos+1];
		s[0]=MAXSIZE;
	}
}

2.11刪除一個子串

void strdelete(str s,int pos,int len){//刪除一個串 
	if(pos<1||pos>=MAXSIZE||len<0||pos>s[0]-len+1){
		exit(-1);
	}
	for(int i=pos+len;i<=s[0];i++){
		s[i-len]=s[i];
	}
	s[0]-=len;
}

2.12用一個串替換掉主串中出現的某個串

void replace(str s,str t,str v){//用v替換掉s與t相等的串 
	int i=1;
	int k;
	if(strempty(t))
	exit(-1);
	while(i){
		i=index(s,t,i);
		if(i){
			strdelete(s,i,strlength(t));
			k=strinsert(s,i,v);
			if(!k)
			exit(-1);
			i+=strlength(v);
		}
	}
}

2.13打印出串的內容

void print(str s){
	int i;
	for(i=1;i<s[0];i++){
		printf("%c",s[i]);
	}
	printf("\n");
}

emmmmm,這次就先更到這,後面的內容放到下一篇裡面吧。

相關推薦

C語言資料結構----棧的定義實現

本節主要說的是資料結構中的棧的基本定義和實現的方式,其中實現的方式採用的是複用順序表和單向連結串列的方式。 一、棧的基本定義 1.棧是一種特殊的線性表,只能從固定的方向進出,而且棧進出的基本原則是:先進棧的元素後出棧。 2.老唐對棧頂棧底的定義: 棧頂:允許操作的一端。

資料結構定義實現

串的基本定義及實現 串型別的定義 定長順序儲存形式 堆分配儲存形式 1.1、串型別的定義 串(string)是零個或多個字元組成的有限序列 , S=‘a1a2…an’(n>=0) 其中,s是串名

java資料結構定義

原始碼的github地址,可以下載到本地執行 串的介面定義 package Interface; import impl.ArrayString; /** * 串 是由零個或者多個字元組成的有限序列 * 串中字元的數目n稱為串的長度 零個字元的串稱為空串 它的長度為

資料結構的基本操作的實現(c語言)

我們先一起來看串的一些概念… 字串(簡稱串),可以將其看作是種特殊的線性表,其特殊性在於線性表的資料元素的型別總是字元性,字串的資料物件約束為字符集。 串是由0個或多個字元組成的有限序列。一般記作:s = “s1 s2 s3 …. sn”,,其中,s是串名

資料結構的模式匹配(C語言實現

一、暴力匹配演算法(BF) BF全稱為Brute-Force,最簡單直觀的模式匹配演算法。 1.演算法思想 兩個字串進行匹配時,一個主串和一個模式串,就是按照我們最容易想到的演算法來進行匹配。用兩個變數i,j分別記錄主串和模式串的匹配位置,如果兩者在某個字

資料結構--順序表定義python實現

       順序表即線性表的順序儲存結構。它是通過一組地址連續的儲存單元對線性表中的資料進行儲存的,相鄰的兩個元素在物理位置上也是相鄰的。比如,第1個元素是儲存線上性表的起始位置LOC(1),那麼第i個元素即是儲存在LOC(1)+(i-1)*sizeof(ElemType

數據結構鏈表實現

oid void scan pan 尋找 最大 執行 連續 邏輯 線性表的鏈式表示和實現 線性表的順序存儲結構的特點是邏輯關系上相鄰的兩個元素在物理位置上也相鄰。正由於這種特點,在做插入和刪除操作時,需移動大量元素。 鏈式存儲:不要求邏輯上相鄰的元素在物理位置上也相鄰,特點

python資料結構KMP演算法的實現

我相信網上已經有很多關於KMP演算法的講解,大致都是關於部分匹配表的實現思路和作用,還有就是目標串的下標不變,僅改變模式串的下標來進行匹配,確實用KMP演算法,當目標串很大模式串很小時,其效率很高的,但都是相對而言。至於對於部分匹配表的作用以及實現思路,建議看一下這篇文章寫的是比較易懂的

資料結構 線性表的實現

 程式碼: #include<algorithm> #include<iostream> #include<stdlib.h> #define MAXSIZE 1100 using namespace std; /* 線性表的實現 1.插入//o

資料結構順序表的實現(C語言)

實現程式碼: #ifndef __LINEARLIST_H__ #define __LINEARLIST_H__ #include <malloc.h> #include <stdi

資料結構 佇列(Queue)的實現 Java

佇列 - 實現 為了實現佇列,我們可以使用動態陣列和指向佇列頭部的索引。 如上所述,佇列應支援兩種操作:入隊和出隊。入隊會向佇列追加一個新元素,而出隊會刪除第一個元素。 所以我們需要一個索引來指出起點。 這是一個供你參考的實現: // "static void mai

python資料結構——概述和基本演算法

概述: 字串(string)簡稱串,也是一種線性結構。在python中和array差不多,因為py的陣列也可以包括各種字元(在C/Java一類的語法中,陣列必須是同一種資料型別的元素)。線性結構,有限序列,是主要特點。串其中可以包含各種元素,也是計算機主要處理的一類物件。因

資料結構】HashTable原理實現學習總結

有兩個類都提供了一個多種用途的hashTable機制,他們都可以將可以key和value結合起來構成鍵值對通過put(key,value)方法儲存起來,然後通過get(key)方法獲取相對應的value值。一個是前面提到的HashMap,還有一個就是馬上要講解的HashTa

資料結構】LinkedList原理實現學習總結

一、LinkedList實現原理概述 LinkedList 和 ArrayList 一樣,都實現了 List 介面,但其內部的資料結構有本質的不同。LinkedList 是基於連結串列實現的(通過名字也能區分開來),所以它的插入和刪除操作比 ArrayList

C語言資料結構靜態連結串列實現(A-B)U(B-A)

時間複雜度O(3n)不是很難,直接貼程式碼:StaticLinkList.h#ifndef _STATIC_LINK_LIST_H_ #define _STATIC_LINK_LIST_H_ #define MAXSIZE 100 typedef enum {ERROR,OK

資料結構的基本操作

1.串的實現相比較而言簡單一些,但個人覺得有一些需要注意的地方,以下一 一列舉:(1)串基本術語:空串:空串指長度為0的串,其不包含任何字元;空格串:不同於空串,它是由一個或多個空格構成的串。雖然是空格,但在計算長度時要把空格的個數算在內;串比較:串的大小比較時以字元的ASC

資料結構順序佇列的實現

上一篇部落格我們講了順序棧和鏈式棧的實現,今天我們來看一下順序佇列的實現 #pragma once #include<stdio.h> #include<stdlib.h> #include<stddef.h> #def

資料結構堆的簡單實現

堆的主要介面包括,堆的初始化,堆的銷燬,堆的插入,堆的刪除,獲取堆頂的資料,判斷堆是否為空,求堆的大小,以及堆的氣泡排序。在這裡還有堆的簡單的資料結構的實現。因為堆是動態增長的,所以實現堆的資料結構裡包含一個存放資料的堆的陣列data,堆的大小sz,以及堆的容量capacit

lua資料結構table的內部實現

一、table結構1、Table結構體首先了解一下table結構的組成結構,table是存放在GCObject裡的。結構如下:typedef struct Table { CommonHeader; lu_byte flags; /* 1<<p mean

資料結構棧go言語實現

package main import ( "fmt" "os" ) type Node struct { val int pNode *Node } type Stack struct