數據結構與算法實戰_2數組與字符串

數組定義與實現

數組-》一種線性表的實現

C

可以使用一個指針通過malloc函數動態的獲取一塊內存作爲一個數組使用。
在這裏插入圖片描述

  • 靜態分配 & 動態分配
    在這裏插入圖片描述
  • 數組名不是指針,如果是指針,那麼8行應該輸出指針的大小(如果是64系統的話,應該是8個字節,如果是32位,應該是4個字節)輸出的結果是400個字節。
    在這裏插入圖片描述
    輸出在這裏插入圖片描述
    所以這裏array不是指針,是個數組
    那麼爲什麼第7行 array可以當指針用呢
    因爲*(array+1) 是個表達式,表達式要求值
    因此是對數組名進行求值,得到了數組的首地址
    數組名作爲參數進行傳遞
    下圖中,函數裏是個指針,也可以用[]來使用。
    在這裏插入圖片描述

C++

當使用指針時,使用new
C++ 動態的內存分配會使用關鍵詞new
它的釋放也不用free 而是delete
在這裏插入圖片描述

在這裏插入圖片描述

  • vector
    10個元素
    在這裏插入圖片描述
    或者這樣初始化
    在這裏插入圖片描述
    重載 << 運算符
    在這裏插入圖片描述
    輸出:
    在這裏插入圖片描述

Java數組

在這裏插入圖片描述
在這裏插入圖片描述
####python
在這裏插入圖片描述

常見操作

在這裏插入圖片描述

c

找x的序號

在這裏插入圖片描述
找第k個元素

在這裏插入圖片描述 在這裏插入圖片描述
找max

在這裏插入圖片描述

python數組

max min index 個數
在這裏插入圖片描述

C++操作數組

iterator 迭代器
在這裏插入圖片描述
查找x
在這裏插入圖片描述有的話,it則到了x的位置,沒有迭代器則走到了最後
在這裏插入圖片描述
如果
在這裏插入圖片描述

數組實例

高精度加法:
求兩個100位的十進制數字之和
在這裏插入圖片描述
java 求多位數之和
在這裏插入圖片描述

二維數組

定義和使用

內存是一維的
二維數組:數組的數組,依然是一維的。

c 定義二維數組

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述

  • 數組的數組: {{},{},{},{},{}}
  • 指針: int *p 定義好了之後,可以寫p[2],p[2] 等價於 *(p+2),
    連續的找到了第二個整型元素的位置
    在這裏插入圖片描述
    int **p
    *靠着p最近,所以p是個指針
    還有一個 * 靠着,所以p指向指針,p是指針的指針。
    int表示;p指向的那個指針指向一個整型
    在這裏插入圖片描述
    p[0][1] 和p[1][1]在的地址實際上沒有任何聯繫的,可能隔得很遠。
    在這裏插入圖片描述
    不能這麼寫
    inr array[3][6]; int **p; p = array;

int array[3][5]; 這裏array的元素是[5]
int (*p)[5];定義一個變量p
*代表 p是一個指針
[5]代表:這個指針指向[5],這個指針指向一個有5個元素的數組。
int代表:這個數組每個元素都是int類型。
所以這樣寫可以:

int array[3][5];
int (*p)[5];
p = array;

c語言數組傳參

在這裏插入圖片描述
array[][5]是個指針
也可以寫成
在這裏插入圖片描述
函數原型或申明裏面可以不寫名字
注意:不能省略括號,即不能改變順序
在這裏插入圖片描述

java中使用二維數組

int[][] array = new int[]5[10]; 這裏5行其實是5個指向數組的引用。
因此,這五行不一定是連續性的,也可以不一樣長。
在這裏插入圖片描述
這樣就比較像c語言中的int **p

二維數組實例:大炮打蚊子

現在,我們用大炮來打蚊子:蚊子分佈在一個M×N格的二維平面上,每隻蚊子佔據一格。向該平面的任意位置發射炮彈,炮彈的殺傷範圍如下示意:

O
OXO
O
其中,X爲炮彈落點中心,O爲緊靠中心的四個有殺傷力的格子範圍。若蚊子被炮彈命中(位於X格),一擊斃命,若僅被殺傷(位於O格),則損失一半的生命力。也就是說,一次命中或者兩次殺傷均可消滅蚊子。現在給出蚊子的分佈情況以及連續k發炮彈的落點,給出每炮消滅的蚊子數。

輸入格式:
第一行爲兩個不超過20的正整數M和N,中間空一格,表示二維平面有M行、N列。

接下來M行,每行有N個0或者#字符,其中#表示所在格子有蚊子。

接下來一行,包含一個不超過400的正整數k,表示發射炮彈的數量。

最後k行,每行包括一發炮彈的整數座標x和y(0≤x<M,0≤y<N),之間用一個空格間隔。

輸出格式:
對應輸入的k發炮彈,輸出共有k行,第i行即第i發炮彈消滅的蚊子數。

輸入樣例:
5 6
00#00#
000###
00#000
000000
00#000
2
1 2
1 4
輸出樣例:
0
2

#include<stdio.h>
int board[21][21];
int M,N;
int bang(int x, int y, int kill){
    if((x>=0||x<M) && (y>=0||y<N) && board[x][y] > 0){
        board[x][y] -= kill;
        if(board[x][y] <= 0)return 1;
    }
    return 0;
}
int main(){
    scanf("%d %d",&M,&N);
    getchar();
    for(int i = 0; i < M; i++){
        for(int j = 0; j < N; j++){
            board[i][j] = getchar() == '0'?0:2;
        }
        getchar();
    }
    int num;
    scanf("%d", &num);
    int x,y,ncount;
    for(int i = 0; i < num; i++){
        ncount = 0;
        scanf("%d %d", &x, &y);
        ncount += bang(x,y,2);
        ncount += bang(x-1,y,1);
        ncount += bang(x+1,y,1);
        ncount += bang(x,y-1,1);
        ncount += bang(x,y+1,1);
        printf("%d\n",ncount);
    }

    return 0;
}

字符串的定義與使用

  • 一串字符
    在C語言中字符串是不可以更改I的,跟字符數組不一樣。
    C語言運行時分四個部分:代碼 + 常量 \全局變量 + 棧 + 堆
    字符串存放在常量區
  • 字符串的常用操作:
    比較、拼接、複製
    子串:截取、查找、替換、計數
    匹配

C語言-字符串

定義:
·char *str = “hello world;” printf("%s",str);·
打印地址在這裏插入圖片描述
兩個不同的指針指向同一個字符串,指向同一個地址(常量區地址)。
在這裏插入圖片描述
下面打印的地址與上面兩個指針不一樣,因爲 s3數組會放在棧區
在這裏插入圖片描述
下圖打印出 6,每個字符串後面都有一個0,這個0並不是字符0.
在這裏插入圖片描述

string.h頭文件

  1. strcpy
    char *strcpy(char *destin, char *source);
    功能:將source指向的字符串拷到destin。
int main()
{

    char dest[5];
    char *src="123456";
    strcpy(dest, src);
    printf("dest= %s, %s, %s", dest, dest+4, dest+5);

    return 0;
}

在這裏插入圖片描述
2. strncpy
char *strncpy(char *destin, char *source, int len);
功能:將source指向的len個字符串拷到destin。

int main()
{

    char dest[5];
    char *src="123456";
    strncpy(dest, src, 3);
    dest[3]= '\0';
    printf("dest= %s, %s, %s", dest, dest+4, dest+5);

    return 0;
}

在這裏插入圖片描述
結果可知加上‘\0’結束符後dest內容變的更安全,strcpy和strncpy要額外加字符結束符!
3. strcat
char* strcat(char * str1,char * str2);
功能: 把字符串str2接到str1後面,str1最後的’\0’被取消

int main()
{

    char dest[5]="abcd";
    char *src="123456";
    strcat(dest, src);
    printf("dest= %s", dest);

    return 0;
}

在這裏插入圖片描述
4. strncat
char *strncat(char *dest, const char *src, size_t maxlen)
功能: 將字符串src中前maxlen個字符連接到dest中

int main()
{

    char dest[10]="abcd";
    char *src="123456";
    strncat(dest, src, 8);
    printf("dest= %s", dest);

    return 0;
}

與strncpy不同,strncat會自動在末尾加‘\0’,若指定長度超過源字符串長度,則只複製源字符串長度即停止,更安全!
5. strcmp
int strcmp(char * str1,char * str2);
功能: 比較兩個字符串str1,str2
返回: str1<str2,返回負數;str1=str2,返回 0;str1>str2,返回正數

int main()
{

    char dest[10]="abcd";
    char *src="a23456";
    char d2[8]="abcd";
    int res;
    res=strcmp(dest, src);
    printf("res= %d \n", res);
    res=strcmp(dest, d2);
    printf("res= %d \n", res);

    return 0;
}

在這裏插入圖片描述
6. strncmp
int strncmp(char *str1,char *str2,int count)
功能: 對str1和str2中的前count個字符按字典順序比較
返回: 小於0:str1<str2,等於0:str1=str2,大於0:str1>str2

int main()
{

    char dest[10]="abcd";
    char *src="a23456";
    char d2[8]="abcd";
    int res;
    res=strncmp(dest, src, 1);
    printf("res= %d \n", res);
    res=strncmp(dest, d2, 1);
    printf("res= %d \n", res);

    return 0;
}

在這裏插入圖片描述
7. strchr
char* strchr(char* str,char ch);
功能: 找出str指向的字符串中第一次出現字符ch的位置
返回: 返回指向該位置的指針,如找不到,則返回空指針

int main()
{

    char dest[10]="abcd";
    char* rp;
    char ch= 'c';
    rp=strchr(dest, ch);
    if(NULL == rp)
        printf("no %c exist", ch);
    else
        printf("pos of %c is %d", ch, (int)(rp-dest+1));

    return 0;
}

在這裏插入圖片描述
8. strrchr
char *strrchr(const char *s, char c)
功能: 得到字符串s中最後一個含有c字符的位置指針
返回: 位置指針

int main()
{

    char dest[10]="abcdabc";
    char* rp;
    char ch= 'c';
    rp=strrchr(dest, ch);
    if(NULL == rp)
        printf("no %c exist", ch);
    else
        printf("pos of %c is %d", ch, (int)(rp-dest+1));

    return 0;
}

在這裏插入圖片描述
9. strstr
char* strstr(char* str1,char* str2);
功能:找出str2字符串在str1字符串中第一次出現的位置(不包括str2的串結束符)
返回: 返回該位置的指針,如找不到,返回空指針

int main()
{

    char dest[10]="abcdabc";
    char* rp;
    char ch1[]= "c";
    char str2[]= "cda";
    rp=strstr(dest, ch1);
    if(NULL == rp)
        printf("no %s exist", ch1);
    else
        printf("substring is %s \n", rp);

    rp=strstr(dest, str2);
    if(NULL == rp)
        printf("no %s exist", str2);
    else
        printf("substring is %s ", rp);

    return 0;
}

在這裏插入圖片描述
可以找單個字符串(字符不符合參數要求)
10. strnset
char *strnset(char *s, int ch, size_t n)
功能: 將字符串s中前n個字符設置爲ch的值
返回: 指向s的指針

int main()
{

    char dest[10]="abcdabc";
    char* rp;
    char ch= 'F';
    rp=strnset(dest, ch, 4);
    printf("after strnset dest is %s \n", rp);

    return 0;
}

在這裏插入圖片描述
11. strset
char *strset(char *s, int ch)
功能: 將字符串s中所有字符設置爲ch的值
返回: 指向s的指針

int main()
{

    char dest[10]="abcdabc";
    char* rp;
    char ch= 'F';
    rp=strset(dest, ch);
    printf("after strnset dest is %s \n", rp);
    printf("after strnset dest is %s \n", dest);
    return 0;
}

在這裏插入圖片描述
strupr
char *strupr(char *s)
功能: 將字符串s中的字符變爲大寫

int main()
{

    char dest[]="ab,cd,EF,c";
    char* rp;
    rp=strupr(dest);
    printf("dest: %s, rp: %s", dest, rp);

    return 0;
}

在這裏插入圖片描述
char *strlwr(char *s)與它相反,將字符串中的字符變爲小寫字符

C++ 字符串

定義
在這裏插入圖片描述
正則
C++ 原生支持
在這裏插入圖片描述
輸出1:匹配成功
字符串本身有轉義,所以是兩個
在這裏插入圖片描述

JAVA 字符串

定義
在這裏插入圖片描述
正則
在這裏插入圖片描述

Python 字符串

定義
在這裏插入圖片描述
正則
在這裏插入圖片描述
在這裏插入圖片描述
匹配不成功返回none

正則表達式與串的匹配

  • a -> 只能是a
    a|b -> a 或者 b
    [abc] a-z 同理

  • a+ ->至少有一個a
    [a-z0-9] ->一個小寫字母或者數字
    [a-z0-9]+ ->可以匹配任意多個至少

  • 在這裏插入圖片描述
    確定型機 出路是確定的,輸入a只有一條路可以走
    非確定型的自動機,出路是不確定的,既可以轉到狀態一,也可以轉到狀態二。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章