数据结构与算法实践系列文章(二)数组与字符串
數(shù)組與字符串
數(shù)組:
數(shù)組的定義:
就是線性表的實現(xiàn)。
c語言
定義: int array[N] 或者 int *array = malloc();
數(shù)組的名不是指針。
#include <stdio.h> #include <stdio.h> // 這個地方其實是傳入的數(shù)組的地址 *array,和大小 int func(int *array,int size){// array[0] 其實就是指針 array求值得出首地址return array[0]; // 等價于 *(array+0); } int main(int argc,const char * argv[]){// array是一個數(shù)組int array[100] = {11,22,33,44};// 指針的形式int *p = malloc(100 * sizeof(int));// 在這里是獲取到了數(shù)組的指針printf("%d\n",*(array+1));// 傳入的其實是數(shù)組首地址的指針printf("%d\n",func(array,100));return 0; }c++:
數(shù)組定義:int array[N] 或 int * array = new int[N];
java
數(shù)組定義:int array[] = new int[N];
public class main{public static void main(String[] args){int [] array = new int[10];array[1]=222;array[2]=333;System.out.println(array.length);ArrayList<Integer> list = new ArrayList<>();list.add(123);list.add(22);System.out.println(list);} }python
數(shù)組定義: array = [];
數(shù)組元素的查找:
c語言實現(xiàn):
#include <stdio.h>/** ** 根據(jù)值找到下標(biāo) */ int findX(int * array,int size,int x){int flag=0;int index=-1;for(int i=0;i<size;i++){if(array[i]==x){flag =1;index = i;}}return index; } /** ** 根據(jù)下標(biāo)找到值,并把原來的地址給返回過來,并返回狀態(tài)。 */ int findElement(int * array,int size, int k, int *px){if(k>=size || k<0) return 0;else{*px=array[k];return 1;} } /** * 查找最大的。 */ int findMax(int * array, int size){// 是將數(shù)組中的一個元素初始為max;int max =array[0];for(int i=1;i<size;i++){if(max<array[i]) max = array[i];}return max; } int main(int argc,const char * argv[]){int array[10] = {111,112,33,44,55};int x;x=12;int k;k= findX(array,10,x);printf("%d\n",k);int m,flag;// 傳入的是數(shù)組引用,長度,和下標(biāo),和地址flag= findElement(array,10,3,&m);printf("%d,%d\n",flag,m);// 查找最大值int max ;max = findMax(array,10);printf("%d\n",max);return 0; }求兩個100位的十進制的和。
C語言實現(xiàn)
int main(int argc, const char * argv[]){// // 思路 用數(shù)組 ,數(shù)組的底位存0號元素(如果0號元素存在高位,則是不可以進位的)int a[11] = {0,9,8,7,6,5,4,3,2,1};int b[11] = {1,2,3,4,5,6,7,8,9,9};int sum[11] = {0};int carry=0;//進位操作// i< 11是為了計算最后一個for(int i=0;i<11;i++){int s;s=a[i]+b[i]+carry;carry = s/10;sum[i] = s%10;}for(int i=10;i>=0;i--){printf("%d",sum[i]);}putchar('\n');return 0; }java 實現(xiàn):
public static void main(String[] args){BigInteger a= new BigInteger("12345678");BigInteger b= new BigInteger("12345678");BigInteger c= a.add(b);System.out.println(c); }二維數(shù)組
二維數(shù)組的實質(zhì):數(shù)組的數(shù)組。數(shù)組中的每一個元素仍然是個數(shù)組。
邏輯上可看做二維,其實并不是二維的
c語言
int array [][] 與 int **array
int array[3][4];和int **pa 的中的array和pa類型是相同的,但是 pa== array的寫法是錯誤的
int array [ ][ ] 與int * *
array是數(shù)組的數(shù)組。
int *p ===> 是p 指向一個整形變量。
p[2] <==> *(p+2) 就是 p指向的整形變量再+2的位置就是 p[2]
int * * p 因為*靠p元素最近,所以p是一個指針。所以 * * p是指的是指針的指針。p[1][1]與 p[0][1]的位置截然不同,并不是相差一個
int * *p= array是錯誤的
#include <stdio.h>int main(void) { printf("test");int array[3][5]; // 是由int[5]//int *p[5];//p =array; // 這樣是錯誤的。int (*p)[5];p = array; // 數(shù)組名賦值與指針。 那也就是 array是 一個指針。int a[10];int *pa =a // s數(shù)組的名求值可獲取數(shù)組元素的受地址。所以 *pa就是一個指針。return 0; }數(shù)組傳參:
#include <stdio.h> vaid func(int (*)[5] , int ){// int (*)[5] 就是一個指向[5]的指針 } void func(int array[][5] ,int k){// int array[][5]==>int (*p) [5];}int main(void) { printf("test");int array[3][5]; // 是由int[5]//int *p[5];//p =array; // 這樣是錯誤的。int (*p)[5];p = array; // 數(shù)組名賦值與指針。 那也就是 array是 一個指針。// 這傳遞的是指針func(array, 3);int a[10];int *pa =a // s數(shù)組的名求值可獲取數(shù)組元素的受地址。所以 *pa就是一個指針。return 0; }java
public void test(){// 這是個3行的但是列未定義。int[][] array= new int[3][];array[0] = new int[5]; // 第0行有5列 ,創(chuàng)建有5個整形變量的數(shù)組arry[1] = new int[4];array[2]= new int[3]; }大炮打蚊子案例:
/*** 蚊子分布在一個M×N格的二維平面上,每只蚊子占據(jù)一格。向該平面的任意位置發(fā)射炮彈,炮彈的殺傷范圍如下示意:O OXOO 其中,X為炮彈落點中心,O為緊靠中心的四個有殺傷力的格子范圍。若蚊子被炮彈命中(位于X格),一擊斃命,若僅被殺傷(位于O格),則損失一半的生命力。也就是說,一次命中或者兩次殺傷均可消滅蚊子。現(xiàn)在給出蚊子的分布情況以及連續(xù)k發(fā)炮彈的落點,給出每炮消滅的蚊子數(shù)。輸入格式: 第一行為兩個不超過20的正整數(shù)M和N,中間空一格,表示二維平面有M行、N列。接下來M行,每行有N個0或者#字符,其中#表示所在格子有蚊子。接下來一行,包含一個不超過400的正整數(shù)k,表示發(fā)射炮彈的數(shù)量。最后k行,每行包括一發(fā)炮彈的整數(shù)坐標(biāo)x和y(0≤x<M,0≤y<N),之間用一個空格間隔。輸出格式: 對應(yīng)輸入的k發(fā)炮彈,輸出共有k行,第i行即第i發(fā)炮彈消滅的蚊子數(shù)。輸入樣例: 5 6 00#00# 000### 00#000 000000 00#000 2 1 2 1 4 輸出樣例: 0 2* */ #include <stdio.h>int board[20][20]; int M,N; // 函數(shù)處理邏輯 當(dāng)前坐標(biāo) 和 殺上力 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;}else{return 0;}}else{return 0;}return 1; } int main(int argc, const char * argv[]){scanf("%d%d",&M,&N);getchar();// 去除換行符for(int i=0;i<M;i++){for(int j=0;j<N;j++){// 給數(shù)組賦值:令蚊子的生命力為2;因為如果為1時炮彈沒有擊中,而是在// 炮彈范圍內(nèi)所以讓其生命力為2更好計算。board[i][j] = getchar() == '0' ? 0:2;}// 再次讀取換行符getchar();}int k;scanf("%d",&k);for(int i=0;i<k;i++){// 用來定義大炮打的一泡的落點int x,y;scanf("%d%d",&x,&y);int count=0;count += bang(x,y,2);count += bang(x-1,y,1);count += bang(x,y-1,1);count += bang(x,y+1,1);printf("%d\n",count);}return 0; }字符串
字符串就是一串字符。
字符串的定義:
c語言:“abcdefeg” 或 字符數(shù)組
#include <stdio.h>int main(void) { // c 語言運行時內(nèi)存有四個部分: 棧,堆,常量區(qū),代碼塊char *str ="hello world";printf("%s\n",str);printf("%p\n",str);char *str2 ="hello world";printf("%s\n",str2);printf("%p\n",str2);// 這的是s3放到了堆棧里了char s3[] = "hello";printf("%s\n",s3);printf("%p\n",s3);// s4數(shù)組是將常量池中的拿過來char s4[] = "hello word";printf("%s\n",s4);printf("%p\n",s4);printf("%d\n",sizeof(s3));return 0; } // 輸出: hello world 0x402004 hello world 0x402004 hello 0x7fffc8a4589a hello word 0x7fffc8a4588f 6 可以看到 *str 與*str 兩個字符的指針指向的位置相同。c++
#include <iostream> using namespace std;int main() {string name;cout << name <<"\n"; // 什么都沒有是空字符串string name2="llk";cout << name2 <<"\n"; return 0; }java
public void name(){String name ="張三";System.out.println(name);// java一般都是new出來的而這個卻可以直接復(fù)值;// String name = "zhang" 這個其實就是在常量池中創(chuàng)建了一個對象,然后name引用指向常量池; 等價于 char data[] = {'z','h','a','n',y};String namestr= new String(data);// String name = new String("zhang");// 這個是在堆棧中創(chuàng)建一個新的對象將“zhang”放到靜態(tài)區(qū) } String str="hello";//直接賦值的方式,先在棧中創(chuàng)建一個對String類的對象的引用變量str,然后查找棧中有沒有存放“hello”,如果沒有就將“hello”存放在棧,并令star指向“hello”,如果已經(jīng)有“hello”直接令str指向“hello”通過構(gòu)造方法創(chuàng)建字符串對象是在堆內(nèi)存 String str=new String("hello");//實例化的方式1)直接賦值(String str = "hello"):只開辟一塊堆內(nèi)存空間,并且會自動入池(到常量池中),不會產(chǎn)生垃圾。2)構(gòu)造方法(String str= new String("hello");):會開辟兩塊堆內(nèi)存空間,其中一塊堆內(nèi)存會變成垃圾被系統(tǒng)回收,而且不能夠自動入池(到常量池中),需要通過public String intern();方法進行手工入池(到常量池中)。new的每次都會創(chuàng)建對象,他只會存在堆中,每次調(diào)用一次就會創(chuàng)建一個新的對象。 將“hello”放到靜態(tài)區(qū)在開發(fā)的過程中不會采用構(gòu)造方法進行字符串的實例化。正則表達式與串的匹配
正則表達式是用于對字符串的匹配。
自動機
- 非確定型有限狀態(tài)自動機(NFA):
- 確定型有限狀態(tài)自動機(DFA):
總結(jié)
以上是生活随笔為你收集整理的数据结构与算法实践系列文章(二)数组与字符串的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日期天数转换
- 下一篇: 【读文献】primal dual PBD