1、集合
一、咱們印象中的集合應該最大致如今數學學習中,在高一剛剛入學的時候就已經學習了集合是什麼,映射是什麼,綜合學習數學以及Java的的經驗,顧名思義,其實集合就是一些元素的總和,而這些元素能夠是一些數字,或者一些類,反正是咱們自身在編程的時候所須要的東西。
二、集合能夠分爲兩大類:包括線性集合和非線性集合。從字面上就能夠理解這兩種集合的區別,線性與非線性的區別,可是所謂的線性所表現出的是什麼呢,這就是咱們要深刻了解的地方。php
三、抽象:如何去理解這個抽象,在我看來,它無非就是構成一個事物必不可少的東西,可是咱們能夠經過一些步驟或者工具去簡化(或忽略)一些細節,使得咱們本身能夠去控制這個事物達到這個事物的最大效能,或者是完成這個事物應當作的任務。綜合來說,就是能夠經過一些方法將一個複雜的事物簡單化之後變得更加容易控制的東西。
四、強調的一點是:集合也是一種抽象。
五、抽象數據類型(Abstract Date Type,ADT):是一種在程序設計語言中還沒有定義其值和操做的數據類型。ADT的抽象性體如今,ADT必須對其實現細節進行定義,且這些對用戶是不可見的。
六、數據結構:是一種用於實現集合的編程結構集。
七、集合是一種隱藏了實現細節的抽象。
八、Java集合API是一個類集,表示了一些特定類型的集合,這些類的實現方式各不相同。html
2、棧集合
一、棧的元素是按後進先出(LIFO)的方法進行處理的,最後進入棧中的元素最早被移除。
二、編程人員選擇的數據結構,應與須要進行數據管理的類型相適應。
三、棧的一些操做方法:java
操做 | 描述 |
---|---|
push | 添加一個元素到棧的頂部 |
pop | 從棧的頂部移出一個元素 |
peek | 查看棧頂部的元素 |
isempty | 肯定棧是否爲空 |
size | 肯定棧的元素數目 |
3、主要的面向對象概念
一、繼承性與多態:node
4、異常
一、錯誤和異常表示不正常或不合法的處理。android
5、棧ADT
一、Java接口定義了一個抽象方法集,有助於把抽象數據類型的概念與其實現分隔開來。
二、經過使用接口名做爲返回類型,方法就不會侷限於實現棧的任何特定類。git
6、用數組實現棧web
代碼:編程
import java.util.Arrays; import java.util.EmptyStackException; public class ArrayStack<T> implements StackADT<T> { private final int DEFAULT_CAPACITY = 100; private int top; private T[] stack; public ArrayStack(){ top = 0; stack = (T[]) (new Object[DEFAULT_CAPACITY]); } // public ArrayStack(int initialCapacity){ // top = 0; // stack = (T[]) (new Object[initialCapacity]); // } @Override public void push(T element){ if(size()==stack.length) expandCapacity(); stack[top] = element; top++; } private void expandCapacity(){ stack= Arrays.copyOf(stack,stack.length*2); } @Override public int size(){ int b=0; for(int a = 0; stack[a] != null;a++) { b++; } return b; } @Override public T pop() throws EmptyCollectionException { if (isEmpty()) throw new EmptyCollectionException("Stack"); top--; T result = stack[top]; stack[top] = null; return result; } @Override public T peek() throws EmptyStackException { if (isEmpty()) throw new EmptyCollectionException("Stack"); return stack[top-1]; } @Override public boolean isEmpty(){ boolean p ; if (stack[0]!=null){ p=false; } else { p=true; } return p; } @Override public String toString(){ String result = ""; for(int a = 0; a<size();a++){ result += String.valueOf(stack[a] +" "); } return result; } }
1、連接做爲引用
一、對象引用變量能夠用來建立鏈式結構。
二、鏈表由一些對象構成,其中每一個對象指向了鏈表中的下一對象。
三、在鏈表中儲存的對象一般泛稱爲鏈表的結點。
四、鏈表會按需動態增加,所以在本質上,它沒有容量限制。
2、管理鏈表
一、插入結點:改變引用順序是維護鏈表的關鍵。
數組
二、刪除結點:處理鏈表的首結點須要進行一些特殊處理。
安全
3、無連接的元素
一、儲存在集合中的對象不該該含有基本數據結構的任何實現細節。
二、雙向鏈表:在雙向鏈表中,須要維護兩個引用:一個引用指向鏈表的首結點;另外一個引用指向鏈表的末端點。鏈表的每一個結點都存在兩個引用:一個指向下一個元素,另外一個指向上一個元素。
4、用鏈表實現棧
一、只要有效地實現了恰當的操做,集合的實現均可用來求解問題。
package chapter4.pp4_2; public class LindedStack<T> implements StackADT<T> { private int count; private LinnearNode<T> top; public LindedStack(){ count=0; top=null; } @Override public void push(T element) { LinnearNode<T> temp=new LinnearNode<T>(element); temp.setNext(top); top = temp; count++; } @Override public T pop() throws EmptyCollectionException { if (isEmpty()) throw new EmptyCollectionException("Stack"); T result = top.getElement(); top=top.getNext(); count--; return result; } @Override public T peek() { if (isEmpty()) throw new EmptyCollectionException("Stack"); T result = top.getElement(); top=top.getNext(); return result; } @Override public boolean isEmpty() { boolean p ; if (size()==0){ p=true; } else { p=false; } return p; } @Override public int size() { return count; } @Override public String toString(){ LinnearNode node = new LinnearNode(); ![](https://img2018.cnblogs.com/blog/1333084/201809/1333084-20180918154501879-1136225221.png) while (node != null) { System.out.print(node.getElement()+" "); node = node.getNext(); } return node.getElement().toString(); } }
這就是具體的過程,也讓我本身瞭解到雙鏈表的神奇。
private static double testStack(Stack<Integer> s, int opCnt) { long startTime = System.nanoTime(); for (int i = 0; i < opCnt; i++) { s.push(i); } for (int i = 0; i < opCnt; i++) { s.pop(); } long endTime = System.nanoTime(); return (endTime - startTime) / 1000000000.0; }
上面的代碼實現:對棧進行opCnt次入棧和出棧操做,記錄所消耗的時間。(注:nonoTime的單位是ns,將結果轉換爲s,除以10的9次方)
首先將opCnt設置爲10 0000 來看看性能差別:
public static void main(String[] args) { ArrayStack<Integer> arrayStack = new ArrayStack<Integer>(); LinkedStack<Integer> linkedStack = new LinkedStack<Integer>(); int opCnt = 100000; double time1 = testStack(arrayStack, opCnt); double time2 = testStack(linkedStack, opCnt); System.out.println("arrayStack:" + time1 + "s"); System.out.println("linkedStack:" + time2 + "s"); }
將opCnt設置爲100 0000:
結果:
arrayStack:0.020232116s linkedStack:0.016551687s
將opCnt設置爲1000 0000:
arrayStack:3.780388172s linkedStack:9.333468302s
總結:
基於數組的棧是在數組尾部進行入棧和出棧操做,所以實現複雜度爲O(1);
基於鏈表的棧是在鏈表頭部進行入棧和出棧操做,所以實現複雜度也爲O(1);
所以二者的性能不會差不少,在opCnt=1000 0000時,arrayStack的性能比linkedStack性能要好。緣由是linkedStack要進行大量的new操做,在opCnt較小的狀況下,體現不出性能差別;而在操做次數大時,arrayStack性能優點就體現出來了。
由於個人as傳不到碼雲上面因此在這裏給出個人Java代碼和運行結果:
package com.example.pp3_9; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import java.util.Stack; public class MainActivity extends AppCompatActivity { LinkedlistStack stack=new LinkedlistStack(); private String result=""; int time=0; String re=""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button1=(Button)findViewById(R.id.button); button1.setOnClickListener(new mybuttoninsert1()); Button button2=(Button)findViewById(R.id.button2); button2.setOnClickListener(new mybuttoninsert2()); } public class mybuttoninsert1 implements View.OnClickListener { @Override public void onClick(View view) { EditText a =(EditText) findViewById(R.id.editText3); String[] aa = a.getText().toString().split(""); EditText b =(EditText)findViewById(R.id.editText); stack.push(aa[time]); time++; String result=""; for (int i =0;i<a.getText().length()-time;i++){ result+=aa[i+1]; //result+=aa[a.getText().length()-time]; } b.setText(result); } } public class mybuttoninsert2 implements View.OnClickListener { @Override public void onClick(View view) { EditText c =(EditText)findViewById(R.id.editText2); // c.setText(stack.pop().toString()); re+=stack.pop(); c.setText(re); } } }
錯題1.An efficient system handles problems gracefully
A .True
B .False
正確答案: B 個人答案: A
錯題解析:由於在書裏有這樣一句話:「一個健壯的系統能夠完美地處理各類問題。」被這句話給誤導了。
錯題2.Which of the following has the smallest time complexity?
A .3n+5+2n
B .logn+2
C .3n+4
D .nlogn
正確答案: B 個人答案: D
錯題解析:由於對於題目位置的不肯定性,沒有看出本來題目的意思。
代碼調試中的問題和解決過程, 一個問題加1分
這一週Java課程學習了新知識,也溫習了舊的一些功課,由於對於知識的掌握程度一開始的瞭解程度不是很好,因此就花了很長的時間去理解知識點,知識點的理解對於書本內容的吃透仍是很重要,這一學期的任務相比於上學期的任務只能講熟練程度,由於不少也都是以前寫過的代碼,所以但願本身新的一學期能夠本身加油,努力!唉,又是一波雞湯!!
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | |
---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 |
第一週 | 0/0 | 1/1 | 6/6 |
第二週 | 1313/1313 | 1/2 | 20/26 |
藍墨雲班課
Java程序設計
java:鏈表排序
[數據結構]java實現的簡單鏈表的 頭/尾插法
玩轉數據結構(五)數組棧和鏈表棧性能對比