數組定義與實現
數組-》一種線性表的實現
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
頭文件
- 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只有一條路可以走
非確定型的自動機,出路是不確定的,既可以轉到狀態一,也可以轉到狀態二。