標籤:style sort span 調用 space 4.0 計算 http oid
//Data structure and algorithm
一、資料結構和演算法
在任何語言中都是通用的,是一獨立的學科,除了資料結構就是演算法
常用的資料結構:
數組(Aray),( Stack),隊列( Queue),二叉樹、鏈表( Linked List)、雜湊表、散列表(Hash)等演算法
冒泡排序( bubble sort)、選擇排序( selection sort),二分法尋找等
資料結構和演算法用得好,程式執行效率就高
二、Java中棧
棧按照後進先出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在桟頂,需要讀資料的時候從頂開始彈出資料(最後一個資料被第一個讀出來)。
是允許在同一端進行插入和刪除操作的特殊銭性表。允許進行插入和刪除操作的端稱為棧頂(top),另一端為錢底( botton);底固定,而棧頂浮動中元素個數為零時稱為空白。
插入一股稱為進棧(PUSH),刪除則稱為退棧(POP)。棧也稱為先進後出。
棧可以用來在函數調用的時侯儲存斷點,做遞迴時要用到棧!
三、使用圖形,畫出一個程式的執行流程
方法的執行原理:
方法在調用的時候,才會給該方法在記憶體中分配空間;如果方法只聲明,不調用不會分配空間
方法調用的時候在"棧"中分配空間,(JVM記憶體中有一塊記憶體是 棧記憶體)
方法調用其實是"壓棧",方法結束其實就是"彈棧"
只有結束符號才能"彈棧"
public class Algorithm { public static void main(String[] args) { int i = 100; m1(i); } public static void m1(int i){ m2(i); } public static void m2(int i){ m3(i); } public static void m3(int i){ System.out.println("m3中的方法中的i = " + i); } //層層傳遞 public static void m4(int i){ System.out.println("m3中的方法中的i = " + i); }}
四、遞迴
/*
關於方法的遞迴調用
1.方法的遞迴調用就是方法自身調用自身(自己調自己)
2.以下程式因為遞迴沒有結束條件,所以 一直在壓棧,沒有彈棧,導致棧記憶體溢出!
3.所以遞迴必須要有結束條件
*/
public class Recursion { public static void main(String[] args){ array(1); } public static void array(int i){ System.out.println("Array 被彈出來了"); array(i); } /* Exception in thread "main" java.lang.StackOverflowError at Recursion.array(Recursion.java:7) at Recursion.array(Recursion.java:7) */}
案例一、計算1-N的求和【不使用遞迴,怎麼做】
public class Recursion2 { public static void main(String[] agrs){ int value = sum(6); System.out.println("value = " + value); } //該方法需要完成1-N的求和 //1+2+3+...+N public static int sum(int n){ int sum = 0; for (int i = 0; i <= n ; i ++){ //sum = sum + i; sum += i; } return sum; } //value = 21 //遞迴操作 public static int sum1(int n){ if (n == 1){ return 1; }else { return n + sum1(n-1); } } //value = 21}
案例二、計算N的階乘
public class Recursion3 { public static void main(String[] args){ int n = 5; System.out.println("N的階乘 = " + sum2(n));//N的階乘 = 120 } //1.不使用遞迴 public static int sum(int n){ int result = 1; for (int i = 1 ; i <= n ; i++){ result = result * i; } return result; } //2.使用遞迴 public static int sum2(int n ){ if (n == 1){ return 1; }else { return n * sum2(n-1); } }}
Java資料結構和演算法初探