diff --git a/README.md b/README.md
index 729f25d..da2c17e 100644
--- a/README.md
+++ b/README.md
@@ -1,22 +1,22 @@
 # AlgorithmAndDataArchitecture
 
-<h2>使用Dart语言重写数据结构与算法</h2>
+<h3>使用Python、Flutter的Dart语言重写数据结构与算法</h3>
 
-1. 线性搜索
-2. 选择排序
-3. 插入排序
-4. 栈，队列，循环队列
-5. 链表，链表实现栈，链表实现队列
-6. 递归
-7. 归并排序
-8. 快速排序
-9. 二分搜索
-10. 二分搜索树
+1. **[Dart,Python]线性搜索**
+2. **[Dart,Python]选择排序**
+3. **[Dart,Python]插入排序**
+4. **[Dart,Python]栈，队列，循环队列**
+5. **[Dart,Python]链表，链表实现栈，链表实现队列**
+6. **[Dart,Python]递归**
+7. **[Dart,Python]归并排序**
+8. **[Dart,Python]快速排序**
+9. **[Dart,Python]二分搜索**
+10. **[Dart,Python]二分搜索树**
 11. 集合 和 映射
 12. 堆
 13. 优先队列
-14. 冒泡排序
-15. 希尔排序
+14. **[Dart,Python]冒泡排序**
+15. **[Dart,Python]希尔排序**
 16. 线段树
 17. Trie字典树
 18. 并查集
@@ -26,10 +26,22 @@
 22. 计数排序、LSD基数排序
 23. MSD排序，桶排序
 24. 字符串匹配
-
-#### 后续更新
-1. 将图相关的数据结构与算法用dart语言重新实现
+25. 图的邻接矩阵,邻接表
+26. 图的深度优先遍历
+27. 图的深度优先遍历应用
+    1. 图的联通分量
+    2. 图的单源路径问题
+    3. 无向图的环检测
+    4. 二分图检测
+28. 图的广度优先遍历
+    1. 图的单源路径问题
+    2. 图的联通分量
+    3. 无向图的环检测
+    4. 二分图检测
+29. 桥和割点
+30. 最小生成树
 
 #### SDK版本
 1. 版本：2.12.3
 2. Java版本课程地址：[慕课网算法与数据结构](https://class.imooc.com/sale/datastructure)
+3. Java版本图课程：[慕课网图论算法](https://coding.imooc.com/class/370.html)
diff --git a/01-Linear-Search/LinearSearch.dart b/dart/01-Linear-Search/LinearSearch.dart
similarity index 100%
rename from 01-Linear-Search/LinearSearch.dart
rename to dart/01-Linear-Search/LinearSearch.dart
diff --git a/02-Selection-Sort/Selection-sort.dart b/dart/02-Selection-Sort/Selection-sort.dart
similarity index 100%
rename from 02-Selection-Sort/Selection-sort.dart
rename to dart/02-Selection-Sort/Selection-sort.dart
diff --git a/02-Selection-Sort/SortingHelper.dart b/dart/02-Selection-Sort/SortingHelper.dart
similarity index 100%
rename from 02-Selection-Sort/SortingHelper.dart
rename to dart/02-Selection-Sort/SortingHelper.dart
diff --git a/03-Insertion-Sort/ArrayGenerator.dart b/dart/03-Insertion-Sort/ArrayGenerator.dart
similarity index 100%
rename from 03-Insertion-Sort/ArrayGenerator.dart
rename to dart/03-Insertion-Sort/ArrayGenerator.dart
diff --git a/03-Insertion-Sort/InsertionSort.dart b/dart/03-Insertion-Sort/InsertionSort.dart
similarity index 100%
rename from 03-Insertion-Sort/InsertionSort.dart
rename to dart/03-Insertion-Sort/InsertionSort.dart
diff --git a/03-Insertion-Sort/SortingHelper.dart b/dart/03-Insertion-Sort/SortingHelper.dart
similarity index 100%
rename from 03-Insertion-Sort/SortingHelper.dart
rename to dart/03-Insertion-Sort/SortingHelper.dart
diff --git a/04-Stack-Queue/ArrayQueue.dart b/dart/04-Stack-Queue/ArrayQueue.dart
similarity index 100%
rename from 04-Stack-Queue/ArrayQueue.dart
rename to dart/04-Stack-Queue/ArrayQueue.dart
diff --git a/04-Stack-Queue/ArrayStack.dart b/dart/04-Stack-Queue/ArrayStack.dart
similarity index 100%
rename from 04-Stack-Queue/ArrayStack.dart
rename to dart/04-Stack-Queue/ArrayStack.dart
diff --git a/04-Stack-Queue/LoopQueue.dart b/dart/04-Stack-Queue/LoopQueue.dart
similarity index 58%
rename from 04-Stack-Queue/LoopQueue.dart
rename to dart/04-Stack-Queue/LoopQueue.dart
index 81686af..17d04c1 100644
--- a/04-Stack-Queue/LoopQueue.dart
+++ b/dart/04-Stack-Queue/LoopQueue.dart
@@ -1,44 +1,42 @@
 import 'Queue.dart';
 
-class LoopQueue<T> implements Queue<T>{
-
+class LoopQueue<T> implements Queue<T> {
   List? arr;
-  int front = 0,tail=0;
-  int size =0;
+  int front = 0, tail = 0;
+  int size = 0;
 
-  LoopQueue(){
+  LoopQueue() {
     arr = List.filled(10, false);
   }
 
-  LoopQueue.capcity(int capacity){
-    arr = List.filled(capacity+1, false);
-  }
+  // LoopQueue.capcity(int capacity){
+  //   arr = List.filled(capacity+1, false);
+  // }
 
-  int getCapacity(){
+  int getCapacity() {
     //目前这种方式浪费一个空间
-    int capacity =  arr!.length-1;
+    int capacity = arr!.length - 1;
     return capacity;
   }
 
   @override
   dequeue() {
-    if(isEmpty()){
+    if (isEmpty()) {
       throw Exception("Cannot dequeue from an empty queue");
     }
     T ret = arr![front];
     arr![front] = null;
     front = (front + 1) % arr!.length;
     size--;
-    if(size == getCapacity() / 4 && getCapacity() / 2 != 0){
-      resize((getCapacity()/2) as int);
+    if (size == getCapacity() / 4 && getCapacity() / 2 != 0) {
+      resize((getCapacity() / 2) as int);
     }
     return ret;
   }
 
-  void resize(int newCapacity){
-
-    List? newArr = List.filled(newCapacity+1, false);
-    for(int i = 0 ; i < arr!.length ; i ++){
+  void resize(int newCapacity) {
+    List? newArr = List.filled(newCapacity + 1, false);
+    for (int i = 0; i < arr!.length; i++) {
       newArr[i] = arr![(i + front) % arr!.length];
     }
     arr = newArr;
@@ -48,9 +46,7 @@ class LoopQueue<T> implements Queue<T>{
 
   @override
   void enqueue(e) {
-
-    if((tail + 1) % arr!.length == front)
-      resize(getCapacity() * 2);
+    if ((tail + 1) % arr!.length == front) resize(getCapacity() * 2);
     arr![tail] = e;
     tail = (tail + 1) % arr!.length;
     size++;
@@ -58,7 +54,7 @@ class LoopQueue<T> implements Queue<T>{
 
   @override
   getFront() {
-    if(isEmpty()){
+    if (isEmpty()) {
       throw Exception("Queue is empty.");
     }
     return arr![front];
@@ -71,7 +67,7 @@ class LoopQueue<T> implements Queue<T>{
 
   @override
   bool isEmpty() {
-    return front == tail ;
+    return front == tail;
   }
 
   @override
@@ -79,13 +75,11 @@ class LoopQueue<T> implements Queue<T>{
     StringBuffer buffer = new StringBuffer();
     buffer.write("Queue: size = $size , capacity = ${getCapacity()} \n");
     buffer.write('front [');
-    for(int i = front ; i != tail ; i = (i + 1) % arr!.length){
+    for (int i = front; i != tail; i = (i + 1) % arr!.length) {
       buffer.write(arr![i]);
-      if((i + 1) % arr!.length != tail)
-        buffer.write(", ");
+      if ((i + 1) % arr!.length != tail) buffer.write(", ");
     }
     buffer.write("] tail");
     return buffer.toString();
   }
-
-}
\ No newline at end of file
+}
diff --git a/04-Stack-Queue/Main.dart b/dart/04-Stack-Queue/Main.dart
similarity index 90%
rename from 04-Stack-Queue/Main.dart
rename to dart/04-Stack-Queue/Main.dart
index fcf6281..1d376a9 100644
--- a/04-Stack-Queue/Main.dart
+++ b/dart/04-Stack-Queue/Main.dart
@@ -2,7 +2,7 @@ import 'ArrayStack.dart';
 import 'ArrayQueue.dart';
 import 'LoopQueue.dart';
 
-void main(){
+void main() {
 //  ArrayStack<int> stack = new ArrayStack<int>();
 //  for(int i = 0 ; i < 10 ; i ++){
 //    stack.push(i);
@@ -22,13 +22,14 @@ void main(){
 //  }
 
   LoopQueue<int> loopQueue = new LoopQueue<int>();
-  for(int i = 0 ; i < 30 ; i ++){
+
+  for (int i = 0; i < 30; i++) {
     loopQueue.enqueue(i);
     print(loopQueue);
 
-    if(i % 3 == 2){
+    if (i % 3 == 2) {
       loopQueue.dequeue();
       print(loopQueue);
     }
   }
-}
\ No newline at end of file
+}
diff --git a/04-Stack-Queue/Queue.dart b/dart/04-Stack-Queue/Queue.dart
similarity index 100%
rename from 04-Stack-Queue/Queue.dart
rename to dart/04-Stack-Queue/Queue.dart
diff --git a/04-Stack-Queue/Stack.dart b/dart/04-Stack-Queue/Stack.dart
similarity index 100%
rename from 04-Stack-Queue/Stack.dart
rename to dart/04-Stack-Queue/Stack.dart
diff --git a/05-LinkedList/LinkedList.dart b/dart/05-LinkedList/LinkedList.dart
similarity index 100%
rename from 05-LinkedList/LinkedList.dart
rename to dart/05-LinkedList/LinkedList.dart
diff --git a/05-LinkedList/LinkedListQueue.dart b/dart/05-LinkedList/LinkedListQueue.dart
similarity index 100%
rename from 05-LinkedList/LinkedListQueue.dart
rename to dart/05-LinkedList/LinkedListQueue.dart
diff --git a/05-LinkedList/LinkedListStatck.dart b/dart/05-LinkedList/LinkedListStatck.dart
similarity index 100%
rename from 05-LinkedList/LinkedListStatck.dart
rename to dart/05-LinkedList/LinkedListStatck.dart
diff --git a/05-LinkedList/Queue.dart b/dart/05-LinkedList/Queue.dart
similarity index 100%
rename from 05-LinkedList/Queue.dart
rename to dart/05-LinkedList/Queue.dart
diff --git a/05-LinkedList/Stack.dart b/dart/05-LinkedList/Stack.dart
similarity index 100%
rename from 05-LinkedList/Stack.dart
rename to dart/05-LinkedList/Stack.dart
diff --git a/05-LinkedList/main.dart b/dart/05-LinkedList/main.dart
similarity index 100%
rename from 05-LinkedList/main.dart
rename to dart/05-LinkedList/main.dart
diff --git a/06-Recursion/ListNode.dart b/dart/06-Recursion/ListNode.dart
similarity index 100%
rename from 06-Recursion/ListNode.dart
rename to dart/06-Recursion/ListNode.dart
diff --git a/06-Recursion/Solution3.dart b/dart/06-Recursion/Solution3.dart
similarity index 93%
rename from 06-Recursion/Solution3.dart
rename to dart/06-Recursion/Solution3.dart
index 2018b91..244e58a 100644
--- a/06-Recursion/Solution3.dart
+++ b/dart/06-Recursion/Solution3.dart
@@ -14,9 +14,9 @@ class Solution3{
       }
     }
     return dummyHead.next;
-    if(head == null){
-      return head;
-    }
+//    if(head == null){
+//      return head;
+//    }
 //    ListNode? res = removeElements(head.next!, val);
 //    if(head.val == val){
 //      return res;
diff --git a/06-Recursion/Sum.dart b/dart/06-Recursion/Sum.dart
similarity index 100%
rename from 06-Recursion/Sum.dart
rename to dart/06-Recursion/Sum.dart
diff --git a/07-MergeSort-More/ArrayGenerator.dart b/dart/07-MergeSort-More/ArrayGenerator.dart
similarity index 100%
rename from 07-MergeSort-More/ArrayGenerator.dart
rename to dart/07-MergeSort-More/ArrayGenerator.dart
diff --git a/07-MergeSort-More/MergeSort.dart b/dart/07-MergeSort-More/MergeSort.dart
similarity index 100%
rename from 07-MergeSort-More/MergeSort.dart
rename to dart/07-MergeSort-More/MergeSort.dart
diff --git a/07-MergeSort-More/SortingHelper.dart b/dart/07-MergeSort-More/SortingHelper.dart
similarity index 100%
rename from 07-MergeSort-More/SortingHelper.dart
rename to dart/07-MergeSort-More/SortingHelper.dart
diff --git a/07-MergeSort/ArrayGenerator.dart b/dart/07-MergeSort/ArrayGenerator.dart
similarity index 100%
rename from 07-MergeSort/ArrayGenerator.dart
rename to dart/07-MergeSort/ArrayGenerator.dart
diff --git a/07-MergeSort/MergeSort.dart b/dart/07-MergeSort/MergeSort.dart
similarity index 100%
rename from 07-MergeSort/MergeSort.dart
rename to dart/07-MergeSort/MergeSort.dart
diff --git a/07-MergeSort/SortingHelper.dart b/dart/07-MergeSort/SortingHelper.dart
similarity index 100%
rename from 07-MergeSort/SortingHelper.dart
rename to dart/07-MergeSort/SortingHelper.dart
diff --git a/08-QuickSort-More/ArrayGenerator.dart b/dart/08-QuickSort-More/ArrayGenerator.dart
similarity index 100%
rename from 08-QuickSort-More/ArrayGenerator.dart
rename to dart/08-QuickSort-More/ArrayGenerator.dart
diff --git a/08-QuickSort-More/QuickSort2way.dart b/dart/08-QuickSort-More/QuickSort2way.dart
similarity index 98%
rename from 08-QuickSort-More/QuickSort2way.dart
rename to dart/08-QuickSort-More/QuickSort2way.dart
index cd21a02..f455ede 100644
--- a/08-QuickSort-More/QuickSort2way.dart
+++ b/dart/08-QuickSort-More/QuickSort2way.dart
@@ -5,7 +5,7 @@ import 'dart:math';
  * 二路快排
  */
 class QuickSort2way {
-  _QuickSort2way() {}
+  QuickSort2way() {}
 
   static sort2ways(List arr) {
     Random rnd = new Random();
diff --git a/08-QuickSort-More/QuickSort3way.dart b/dart/08-QuickSort-More/QuickSort3way.dart
similarity index 98%
rename from 08-QuickSort-More/QuickSort3way.dart
rename to dart/08-QuickSort-More/QuickSort3way.dart
index 1519e9a..67bcd9f 100644
--- a/08-QuickSort-More/QuickSort3way.dart
+++ b/dart/08-QuickSort-More/QuickSort3way.dart
@@ -4,7 +4,7 @@ import 'dart:math';
  * 三路快排
  */
 class QuickSort3way {
-  _QuickSort3way() {}
+  QuickSort3way() {}
 
   static sort3ways(List arr) {
     Random rnd = new Random();
diff --git a/08-QuickSort-More/SortingHelper.dart b/dart/08-QuickSort-More/SortingHelper.dart
similarity index 100%
rename from 08-QuickSort-More/SortingHelper.dart
rename to dart/08-QuickSort-More/SortingHelper.dart
diff --git a/08-QuickSort/ArrayGenerator.dart b/dart/08-QuickSort/ArrayGenerator.dart
similarity index 100%
rename from 08-QuickSort/ArrayGenerator.dart
rename to dart/08-QuickSort/ArrayGenerator.dart
diff --git a/08-QuickSort/QuickSort.dart b/dart/08-QuickSort/QuickSort.dart
similarity index 98%
rename from 08-QuickSort/QuickSort.dart
rename to dart/08-QuickSort/QuickSort.dart
index e34637b..50e2c03 100644
--- a/08-QuickSort/QuickSort.dart
+++ b/dart/08-QuickSort/QuickSort.dart
@@ -1,7 +1,7 @@
 import 'ArrayGenerator.dart';
 import 'dart:math';
 class QuickSort{
-  _QuickSort(){
+  QuickSort(){
   }
   static sort(List arr){
     _sortDetail(arr,0,arr.length-1);
diff --git a/08-QuickSort/SortingHelper.dart b/dart/08-QuickSort/SortingHelper.dart
similarity index 100%
rename from 08-QuickSort/SortingHelper.dart
rename to dart/08-QuickSort/SortingHelper.dart
diff --git a/09-Binary-Search-More/up/ArrayGenerator.dart b/dart/09-Binary-Search-More/up/ArrayGenerator.dart
similarity index 100%
rename from 09-Binary-Search-More/up/ArrayGenerator.dart
rename to dart/09-Binary-Search-More/up/ArrayGenerator.dart
diff --git a/09-Binary-Search-More/up/BinarySearchCeil.dart b/dart/09-Binary-Search-More/up/BinarySearchCeil.dart
similarity index 100%
rename from 09-Binary-Search-More/up/BinarySearchCeil.dart
rename to dart/09-Binary-Search-More/up/BinarySearchCeil.dart
diff --git a/09-Binary-Search-More/up/BinarySearchFloor.dart b/dart/09-Binary-Search-More/up/BinarySearchFloor.dart
similarity index 99%
rename from 09-Binary-Search-More/up/BinarySearchFloor.dart
rename to dart/09-Binary-Search-More/up/BinarySearchFloor.dart
index 6b1a252..e18b7ca 100644
--- a/09-Binary-Search-More/up/BinarySearchFloor.dart
+++ b/dart/09-Binary-Search-More/up/BinarySearchFloor.dart
@@ -4,7 +4,7 @@ import 'ArrayGenerator.dart';
  * 二分搜索
  */
 class BinarySearch {
-  _BinarySearch() {}
+  BinarySearch() {}
 
   static int search<T>(List data, T target) {
     int left = 0, right = data.length - 1;
diff --git a/09-Binary-Search-More/up/BinarySearchLowerCeil.dart b/dart/09-Binary-Search-More/up/BinarySearchLowerCeil.dart
similarity index 98%
rename from 09-Binary-Search-More/up/BinarySearchLowerCeil.dart
rename to dart/09-Binary-Search-More/up/BinarySearchLowerCeil.dart
index 41f9c1a..37a120e 100644
--- a/09-Binary-Search-More/up/BinarySearchLowerCeil.dart
+++ b/dart/09-Binary-Search-More/up/BinarySearchLowerCeil.dart
@@ -4,7 +4,7 @@ import 'ArrayGenerator.dart';
  * 二分搜索
  */
 class BinarySearch {
-  _BinarySearch() {}
+  BinarySearch() {}
 
   static int search<T>(List data, T target) {
     int left = 0, right = data.length - 1;
diff --git a/09-Binary-Search-More/up/BinarySearchUp.dart b/dart/09-Binary-Search-More/up/BinarySearchUp.dart
similarity index 98%
rename from 09-Binary-Search-More/up/BinarySearchUp.dart
rename to dart/09-Binary-Search-More/up/BinarySearchUp.dart
index 6f3c827..3402f41 100644
--- a/09-Binary-Search-More/up/BinarySearchUp.dart
+++ b/dart/09-Binary-Search-More/up/BinarySearchUp.dart
@@ -5,7 +5,7 @@ import 'ArrayGenerator.dart';
  */
 class BinarySearch{
 
-  _BinarySearch(){}
+  BinarySearch(){}
 
   static int search<T>(List data,T target){
 
diff --git a/09-Binary-Search/ArrayGenerator.dart b/dart/09-Binary-Search/ArrayGenerator.dart
similarity index 100%
rename from 09-Binary-Search/ArrayGenerator.dart
rename to dart/09-Binary-Search/ArrayGenerator.dart
diff --git a/09-Binary-Search/BinarySearchR.dart b/dart/09-Binary-Search/BinarySearchR.dart
similarity index 98%
rename from 09-Binary-Search/BinarySearchR.dart
rename to dart/09-Binary-Search/BinarySearchR.dart
index b5b2233..1d502eb 100644
--- a/09-Binary-Search/BinarySearchR.dart
+++ b/dart/09-Binary-Search/BinarySearchR.dart
@@ -5,7 +5,7 @@ import 'ArrayGenerator.dart';
  */
 class BinarySearch{
 
-  _BinarySearch(){}
+  BinarySearch(){}
 
   static int search<T>(List data,T target){
 
diff --git a/10-Binary-Search-Tree/BST.dart b/dart/10-Binary-Search-Tree/BST.dart
similarity index 99%
rename from 10-Binary-Search-Tree/BST.dart
rename to dart/10-Binary-Search-Tree/BST.dart
index 457aeef..62709d8 100644
--- a/10-Binary-Search-Tree/BST.dart
+++ b/dart/10-Binary-Search-Tree/BST.dart
@@ -266,7 +266,7 @@ class BST<T extends Comparable<T>> {
     if( node == null )
       return null;
 
-    if( e!.compareTo(node.e!) < 0 ){
+    if( e.compareTo(node.e!) < 0 ){
       node.left = _removeNode(node.left! , e);
       return node;
     }
diff --git a/10-Binary-Search-Tree/LinkedList.dart b/dart/10-Binary-Search-Tree/LinkedList.dart
similarity index 100%
rename from 10-Binary-Search-Tree/LinkedList.dart
rename to dart/10-Binary-Search-Tree/LinkedList.dart
diff --git a/10-Binary-Search-Tree/LinkedListQueue.dart b/dart/10-Binary-Search-Tree/LinkedListQueue.dart
similarity index 100%
rename from 10-Binary-Search-Tree/LinkedListQueue.dart
rename to dart/10-Binary-Search-Tree/LinkedListQueue.dart
diff --git a/10-Binary-Search-Tree/LinkedListStatck.dart b/dart/10-Binary-Search-Tree/LinkedListStatck.dart
similarity index 100%
rename from 10-Binary-Search-Tree/LinkedListStatck.dart
rename to dart/10-Binary-Search-Tree/LinkedListStatck.dart
diff --git a/10-Binary-Search-Tree/Main.dart b/dart/10-Binary-Search-Tree/Main.dart
similarity index 100%
rename from 10-Binary-Search-Tree/Main.dart
rename to dart/10-Binary-Search-Tree/Main.dart
diff --git a/10-Binary-Search-Tree/Queue.dart b/dart/10-Binary-Search-Tree/Queue.dart
similarity index 100%
rename from 10-Binary-Search-Tree/Queue.dart
rename to dart/10-Binary-Search-Tree/Queue.dart
diff --git a/10-Binary-Search-Tree/Stack.dart b/dart/10-Binary-Search-Tree/Stack.dart
similarity index 100%
rename from 10-Binary-Search-Tree/Stack.dart
rename to dart/10-Binary-Search-Tree/Stack.dart
diff --git a/11-Set-And-Map/BST.dart b/dart/11-Set-And-Map/BST.dart
similarity index 100%
rename from 11-Set-And-Map/BST.dart
rename to dart/11-Set-And-Map/BST.dart
diff --git a/11-Set-And-Map/BSTMap.dart b/dart/11-Set-And-Map/BSTMap.dart
similarity index 100%
rename from 11-Set-And-Map/BSTMap.dart
rename to dart/11-Set-And-Map/BSTMap.dart
diff --git a/11-Set-And-Map/BSTSet.dart b/dart/11-Set-And-Map/BSTSet.dart
similarity index 100%
rename from 11-Set-And-Map/BSTSet.dart
rename to dart/11-Set-And-Map/BSTSet.dart
diff --git a/11-Set-And-Map/FileOperator.dart b/dart/11-Set-And-Map/FileOperator.dart
similarity index 100%
rename from 11-Set-And-Map/FileOperator.dart
rename to dart/11-Set-And-Map/FileOperator.dart
diff --git a/11-Set-And-Map/LinkedList.dart b/dart/11-Set-And-Map/LinkedList.dart
similarity index 100%
rename from 11-Set-And-Map/LinkedList.dart
rename to dart/11-Set-And-Map/LinkedList.dart
diff --git a/11-Set-And-Map/LinkedListMap.dart b/dart/11-Set-And-Map/LinkedListMap.dart
similarity index 100%
rename from 11-Set-And-Map/LinkedListMap.dart
rename to dart/11-Set-And-Map/LinkedListMap.dart
diff --git a/11-Set-And-Map/LinkedListQueue.dart b/dart/11-Set-And-Map/LinkedListQueue.dart
similarity index 100%
rename from 11-Set-And-Map/LinkedListQueue.dart
rename to dart/11-Set-And-Map/LinkedListQueue.dart
diff --git a/11-Set-And-Map/LinkedListStatck.dart b/dart/11-Set-And-Map/LinkedListStatck.dart
similarity index 100%
rename from 11-Set-And-Map/LinkedListStatck.dart
rename to dart/11-Set-And-Map/LinkedListStatck.dart
diff --git a/11-Set-And-Map/Main.dart b/dart/11-Set-And-Map/Main.dart
similarity index 100%
rename from 11-Set-And-Map/Main.dart
rename to dart/11-Set-And-Map/Main.dart
diff --git a/11-Set-And-Map/Map.dart b/dart/11-Set-And-Map/Map.dart
similarity index 100%
rename from 11-Set-And-Map/Map.dart
rename to dart/11-Set-And-Map/Map.dart
diff --git a/11-Set-And-Map/Queue.dart b/dart/11-Set-And-Map/Queue.dart
similarity index 100%
rename from 11-Set-And-Map/Queue.dart
rename to dart/11-Set-And-Map/Queue.dart
diff --git a/11-Set-And-Map/Set.dart b/dart/11-Set-And-Map/Set.dart
similarity index 100%
rename from 11-Set-And-Map/Set.dart
rename to dart/11-Set-And-Map/Set.dart
diff --git a/11-Set-And-Map/Stack.dart b/dart/11-Set-And-Map/Stack.dart
similarity index 100%
rename from 11-Set-And-Map/Stack.dart
rename to dart/11-Set-And-Map/Stack.dart
diff --git a/11-Set-And-Map/text1.txt b/dart/11-Set-And-Map/text1.txt
similarity index 100%
rename from 11-Set-And-Map/text1.txt
rename to dart/11-Set-And-Map/text1.txt
diff --git a/11-Set-And-Map/text2.txt b/dart/11-Set-And-Map/text2.txt
similarity index 100%
rename from 11-Set-And-Map/text2.txt
rename to dart/11-Set-And-Map/text2.txt
diff --git a/12-Heap/HeapSort.dart b/dart/12-Heap/HeapSort.dart
similarity index 100%
rename from 12-Heap/HeapSort.dart
rename to dart/12-Heap/HeapSort.dart
diff --git a/12-Heap/Main.dart b/dart/12-Heap/Main.dart
similarity index 100%
rename from 12-Heap/Main.dart
rename to dart/12-Heap/Main.dart
diff --git a/12-Heap/MaxHeap.dart b/dart/12-Heap/MaxHeap.dart
similarity index 100%
rename from 12-Heap/MaxHeap.dart
rename to dart/12-Heap/MaxHeap.dart
diff --git a/12-Heap/MinHeap.dart b/dart/12-Heap/MinHeap.dart
similarity index 100%
rename from 12-Heap/MinHeap.dart
rename to dart/12-Heap/MinHeap.dart
diff --git a/12-Heap/SortingHelper.dart b/dart/12-Heap/SortingHelper.dart
similarity index 100%
rename from 12-Heap/SortingHelper.dart
rename to dart/12-Heap/SortingHelper.dart
diff --git a/13-Priority-Queue/MaxHeap.dart b/dart/13-Priority-Queue/MaxHeap.dart
similarity index 100%
rename from 13-Priority-Queue/MaxHeap.dart
rename to dart/13-Priority-Queue/MaxHeap.dart
diff --git a/13-Priority-Queue/PriorityQueue.dart b/dart/13-Priority-Queue/PriorityQueue.dart
similarity index 100%
rename from 13-Priority-Queue/PriorityQueue.dart
rename to dart/13-Priority-Queue/PriorityQueue.dart
diff --git a/13-Priority-Queue/Queue.dart b/dart/13-Priority-Queue/Queue.dart
similarity index 100%
rename from 13-Priority-Queue/Queue.dart
rename to dart/13-Priority-Queue/Queue.dart
diff --git a/14-Bubble-Sort/BubblSort.dart b/dart/14-Bubble-Sort/BubblSort.dart
similarity index 100%
rename from 14-Bubble-Sort/BubblSort.dart
rename to dart/14-Bubble-Sort/BubblSort.dart
diff --git a/14-Bubble-Sort/SortingHelper.dart b/dart/14-Bubble-Sort/SortingHelper.dart
similarity index 100%
rename from 14-Bubble-Sort/SortingHelper.dart
rename to dart/14-Bubble-Sort/SortingHelper.dart
diff --git a/15-Shell-Sort/ArrayGenerator.dart b/dart/15-Shell-Sort/ArrayGenerator.dart
similarity index 100%
rename from 15-Shell-Sort/ArrayGenerator.dart
rename to dart/15-Shell-Sort/ArrayGenerator.dart
diff --git a/15-Shell-Sort/ShellSort.dart b/dart/15-Shell-Sort/ShellSort.dart
similarity index 100%
rename from 15-Shell-Sort/ShellSort.dart
rename to dart/15-Shell-Sort/ShellSort.dart
diff --git a/15-Shell-Sort/SortingHelper.dart b/dart/15-Shell-Sort/SortingHelper.dart
similarity index 100%
rename from 15-Shell-Sort/SortingHelper.dart
rename to dart/15-Shell-Sort/SortingHelper.dart
diff --git a/16-Segment-Tree/Main.dart b/dart/16-Segment-Tree/Main.dart
similarity index 100%
rename from 16-Segment-Tree/Main.dart
rename to dart/16-Segment-Tree/Main.dart
diff --git a/16-Segment-Tree/Merger.dart b/dart/16-Segment-Tree/Merger.dart
similarity index 100%
rename from 16-Segment-Tree/Merger.dart
rename to dart/16-Segment-Tree/Merger.dart
diff --git a/16-Segment-Tree/Segment.dart b/dart/16-Segment-Tree/Segment.dart
similarity index 100%
rename from 16-Segment-Tree/Segment.dart
rename to dart/16-Segment-Tree/Segment.dart
diff --git a/17-Trie/FileOperator.dart b/dart/17-Trie/FileOperator.dart
similarity index 100%
rename from 17-Trie/FileOperator.dart
rename to dart/17-Trie/FileOperator.dart
diff --git a/17-Trie/Main.dart b/dart/17-Trie/Main.dart
similarity index 100%
rename from 17-Trie/Main.dart
rename to dart/17-Trie/Main.dart
diff --git a/17-Trie/Trie.dart b/dart/17-Trie/Trie.dart
similarity index 96%
rename from 17-Trie/Trie.dart
rename to dart/17-Trie/Trie.dart
index b837900..3b5801a 100644
--- a/17-Trie/Trie.dart
+++ b/dart/17-Trie/Trie.dart
@@ -45,7 +45,7 @@ class Trie {
   // 查询是否在Trie中有单词以prefix为前缀
   bool isPrefix(String prefix){
     _Node? cur = _root;
-    for(int i = 0 ; i < prefix!.length ; i ++){
+    for(int i = 0 ; i < prefix.length ; i ++){
       String c = prefix[i];
       if(cur!.next![c] == null){
         return false;
diff --git a/17-Trie/text1.txt b/dart/17-Trie/text1.txt
similarity index 100%
rename from 17-Trie/text1.txt
rename to dart/17-Trie/text1.txt
diff --git a/17-Trie/text2.txt b/dart/17-Trie/text2.txt
similarity index 100%
rename from 17-Trie/text2.txt
rename to dart/17-Trie/text2.txt
diff --git a/18-Union-Find/Main.dart b/dart/18-Union-Find/Main.dart
similarity index 100%
rename from 18-Union-Find/Main.dart
rename to dart/18-Union-Find/Main.dart
diff --git a/18-Union-Find/UF.dart b/dart/18-Union-Find/UF.dart
similarity index 100%
rename from 18-Union-Find/UF.dart
rename to dart/18-Union-Find/UF.dart
diff --git a/18-Union-Find/UnionFind1.dart b/dart/18-Union-Find/UnionFind1.dart
similarity index 100%
rename from 18-Union-Find/UnionFind1.dart
rename to dart/18-Union-Find/UnionFind1.dart
diff --git a/18-Union-Find/UnionFind2.dart b/dart/18-Union-Find/UnionFind2.dart
similarity index 100%
rename from 18-Union-Find/UnionFind2.dart
rename to dart/18-Union-Find/UnionFind2.dart
diff --git a/18-Union-Find/UnionFind3.dart b/dart/18-Union-Find/UnionFind3.dart
similarity index 100%
rename from 18-Union-Find/UnionFind3.dart
rename to dart/18-Union-Find/UnionFind3.dart
diff --git a/18-Union-Find/UnionFind4.dart b/dart/18-Union-Find/UnionFind4.dart
similarity index 100%
rename from 18-Union-Find/UnionFind4.dart
rename to dart/18-Union-Find/UnionFind4.dart
diff --git a/18-Union-Find/UnionFind5.dart b/dart/18-Union-Find/UnionFind5.dart
similarity index 100%
rename from 18-Union-Find/UnionFind5.dart
rename to dart/18-Union-Find/UnionFind5.dart
diff --git a/18-Union-Find/UnionFind6.dart b/dart/18-Union-Find/UnionFind6.dart
similarity index 100%
rename from 18-Union-Find/UnionFind6.dart
rename to dart/18-Union-Find/UnionFind6.dart
diff --git a/19-AVL-Tree/AVLTree.dart b/dart/19-AVL-Tree/AVLTree.dart
similarity index 100%
rename from 19-AVL-Tree/AVLTree.dart
rename to dart/19-AVL-Tree/AVLTree.dart
diff --git a/19-AVL-Tree/BST.dart b/dart/19-AVL-Tree/BST.dart
similarity index 100%
rename from 19-AVL-Tree/BST.dart
rename to dart/19-AVL-Tree/BST.dart
diff --git a/19-AVL-Tree/FileOperator.dart b/dart/19-AVL-Tree/FileOperator.dart
similarity index 100%
rename from 19-AVL-Tree/FileOperator.dart
rename to dart/19-AVL-Tree/FileOperator.dart
diff --git a/19-AVL-Tree/Main.dart b/dart/19-AVL-Tree/Main.dart
similarity index 100%
rename from 19-AVL-Tree/Main.dart
rename to dart/19-AVL-Tree/Main.dart
diff --git a/19-AVL-Tree/text1.txt b/dart/19-AVL-Tree/text1.txt
similarity index 100%
rename from 19-AVL-Tree/text1.txt
rename to dart/19-AVL-Tree/text1.txt
diff --git a/19-AVL-Tree/text2.txt b/dart/19-AVL-Tree/text2.txt
similarity index 100%
rename from 19-AVL-Tree/text2.txt
rename to dart/19-AVL-Tree/text2.txt
diff --git a/20-Red-Black-Tree/AVLTree.dart b/dart/20-Red-Black-Tree/AVLTree.dart
similarity index 100%
rename from 20-Red-Black-Tree/AVLTree.dart
rename to dart/20-Red-Black-Tree/AVLTree.dart
diff --git a/20-Red-Black-Tree/BST.dart b/dart/20-Red-Black-Tree/BST.dart
similarity index 100%
rename from 20-Red-Black-Tree/BST.dart
rename to dart/20-Red-Black-Tree/BST.dart
diff --git a/20-Red-Black-Tree/FileOperator.dart b/dart/20-Red-Black-Tree/FileOperator.dart
similarity index 100%
rename from 20-Red-Black-Tree/FileOperator.dart
rename to dart/20-Red-Black-Tree/FileOperator.dart
diff --git a/20-Red-Black-Tree/Main.dart b/dart/20-Red-Black-Tree/Main.dart
similarity index 100%
rename from 20-Red-Black-Tree/Main.dart
rename to dart/20-Red-Black-Tree/Main.dart
diff --git a/20-Red-Black-Tree/Main2.dart b/dart/20-Red-Black-Tree/Main2.dart
similarity index 97%
rename from 20-Red-Black-Tree/Main2.dart
rename to dart/20-Red-Black-Tree/Main2.dart
index b688dec..6c14df5 100644
--- a/20-Red-Black-Tree/Main2.dart
+++ b/dart/20-Red-Black-Tree/Main2.dart
@@ -1,4 +1,3 @@
-import 'FileOperator.dart';
 import 'BST.dart';
 import 'AVLTree.dart';
 import 'dart:math';
diff --git a/21-Hash-Table/RBTree.dart b/dart/20-Red-Black-Tree/RBTree.dart
similarity index 99%
rename from 21-Hash-Table/RBTree.dart
rename to dart/20-Red-Black-Tree/RBTree.dart
index de9404d..a1dc4c6 100644
--- a/21-Hash-Table/RBTree.dart
+++ b/dart/20-Red-Black-Tree/RBTree.dart
@@ -1,4 +1,3 @@
-import 'dart:math';
 import 'FileOperator.dart';
 
 /**
diff --git a/20-Red-Black-Tree/text1.txt b/dart/20-Red-Black-Tree/text1.txt
similarity index 100%
rename from 20-Red-Black-Tree/text1.txt
rename to dart/20-Red-Black-Tree/text1.txt
diff --git a/20-Red-Black-Tree/text2.txt b/dart/20-Red-Black-Tree/text2.txt
similarity index 100%
rename from 20-Red-Black-Tree/text2.txt
rename to dart/20-Red-Black-Tree/text2.txt
diff --git a/21-Hash-Table/AVLTree.dart b/dart/21-Hash-Table/AVLTree.dart
similarity index 100%
rename from 21-Hash-Table/AVLTree.dart
rename to dart/21-Hash-Table/AVLTree.dart
diff --git a/21-Hash-Table/BST.dart b/dart/21-Hash-Table/BST.dart
similarity index 100%
rename from 21-Hash-Table/BST.dart
rename to dart/21-Hash-Table/BST.dart
diff --git a/21-Hash-Table/FileOperator.dart b/dart/21-Hash-Table/FileOperator.dart
similarity index 100%
rename from 21-Hash-Table/FileOperator.dart
rename to dart/21-Hash-Table/FileOperator.dart
diff --git a/21-Hash-Table/HashTable.dart b/dart/21-Hash-Table/HashTable.dart
similarity index 100%
rename from 21-Hash-Table/HashTable.dart
rename to dart/21-Hash-Table/HashTable.dart
diff --git a/21-Hash-Table/HashTableSec.dart b/dart/21-Hash-Table/HashTableSec.dart
similarity index 100%
rename from 21-Hash-Table/HashTableSec.dart
rename to dart/21-Hash-Table/HashTableSec.dart
diff --git a/21-Hash-Table/Main.dart b/dart/21-Hash-Table/Main.dart
similarity index 97%
rename from 21-Hash-Table/Main.dart
rename to dart/21-Hash-Table/Main.dart
index 500716d..d174112 100644
--- a/21-Hash-Table/Main.dart
+++ b/dart/21-Hash-Table/Main.dart
@@ -1,6 +1,5 @@
 import 'dart:collection';
 import 'FileOperator.dart';
-import 'HashTable.dart';
 import 'HashTableSec.dart';
 
 void main() async{
diff --git a/20-Red-Black-Tree/RBTree.dart b/dart/21-Hash-Table/RBTree.dart
similarity index 99%
rename from 20-Red-Black-Tree/RBTree.dart
rename to dart/21-Hash-Table/RBTree.dart
index de9404d..a1dc4c6 100644
--- a/20-Red-Black-Tree/RBTree.dart
+++ b/dart/21-Hash-Table/RBTree.dart
@@ -1,4 +1,3 @@
-import 'dart:math';
 import 'FileOperator.dart';
 
 /**
diff --git a/21-Hash-Table/Solution.dart b/dart/21-Hash-Table/Solution.dart
similarity index 95%
rename from 21-Hash-Table/Solution.dart
rename to dart/21-Hash-Table/Solution.dart
index 6993fe8..dfa1768 100644
--- a/21-Hash-Table/Solution.dart
+++ b/dart/21-Hash-Table/Solution.dart
@@ -1,4 +1,3 @@
-import 'dart:collection';
 
 /**
  * dart中无类型提升
diff --git a/21-Hash-Table/text1.txt b/dart/21-Hash-Table/text1.txt
similarity index 100%
rename from 21-Hash-Table/text1.txt
rename to dart/21-Hash-Table/text1.txt
diff --git a/21-Hash-Table/text2.txt b/dart/21-Hash-Table/text2.txt
similarity index 100%
rename from 21-Hash-Table/text2.txt
rename to dart/21-Hash-Table/text2.txt
diff --git a/22-CountingSort-And-RadixSort/ArrayGenerator.dart b/dart/22-CountingSort-And-RadixSort/ArrayGenerator.dart
similarity index 100%
rename from 22-CountingSort-And-RadixSort/ArrayGenerator.dart
rename to dart/22-CountingSort-And-RadixSort/ArrayGenerator.dart
diff --git a/22-CountingSort-And-RadixSort/LSDSort.dart b/dart/22-CountingSort-And-RadixSort/LSDSort.dart
similarity index 100%
rename from 22-CountingSort-And-RadixSort/LSDSort.dart
rename to dart/22-CountingSort-And-RadixSort/LSDSort.dart
diff --git a/22-CountingSort-And-RadixSort/Main.dart b/dart/22-CountingSort-And-RadixSort/Main.dart
similarity index 100%
rename from 22-CountingSort-And-RadixSort/Main.dart
rename to dart/22-CountingSort-And-RadixSort/Main.dart
diff --git a/22-CountingSort-And-RadixSort/ShellSort.dart b/dart/22-CountingSort-And-RadixSort/ShellSort.dart
similarity index 100%
rename from 22-CountingSort-And-RadixSort/ShellSort.dart
rename to dart/22-CountingSort-And-RadixSort/ShellSort.dart
diff --git a/22-CountingSort-And-RadixSort/Solution.dart b/dart/22-CountingSort-And-RadixSort/Solution.dart
similarity index 94%
rename from 22-CountingSort-And-RadixSort/Solution.dart
rename to dart/22-CountingSort-And-RadixSort/Solution.dart
index e0ab967..be92962 100644
--- a/22-CountingSort-And-RadixSort/Solution.dart
+++ b/dart/22-CountingSort-And-RadixSort/Solution.dart
@@ -1,7 +1,7 @@
 class Solution {
   sortColors(List<int> nums) {
     List? cnt = List.filled(3, 0, growable: true);
-    for (int num in nums!) {
+    for (int num in nums) {
       cnt[num]++;}
 
     for (int i = 0; i < cnt[0]; i++) {
@@ -20,7 +20,7 @@ class Solution {
     int R = 3;
 
     List? cnt = List.filled(3, 0, growable: true);
-    for (int num in nums!) {
+    for (int num in nums) {
       cnt[num]++;
     }
 
diff --git a/22-CountingSort-And-RadixSort/SortingHelper.dart b/dart/22-CountingSort-And-RadixSort/SortingHelper.dart
similarity index 100%
rename from 22-CountingSort-And-RadixSort/SortingHelper.dart
rename to dart/22-CountingSort-And-RadixSort/SortingHelper.dart
diff --git a/22-CountingSort-And-RadixSort/Student.dart b/dart/22-CountingSort-And-RadixSort/Student.dart
similarity index 100%
rename from 22-CountingSort-And-RadixSort/Student.dart
rename to dart/22-CountingSort-And-RadixSort/Student.dart
diff --git a/23-MSDSort-And-BucketSort/ArrayGenerator.dart b/dart/23-MSDSort-And-BucketSort/ArrayGenerator.dart
similarity index 100%
rename from 23-MSDSort-And-BucketSort/ArrayGenerator.dart
rename to dart/23-MSDSort-And-BucketSort/ArrayGenerator.dart
diff --git a/23-MSDSort-And-BucketSort/BucketSort.dart b/dart/23-MSDSort-And-BucketSort/BucketSort.dart
similarity index 98%
rename from 23-MSDSort-And-BucketSort/BucketSort.dart
rename to dart/23-MSDSort-And-BucketSort/BucketSort.dart
index 4855baf..262c885 100644
--- a/23-MSDSort-And-BucketSort/BucketSort.dart
+++ b/dart/23-MSDSort-And-BucketSort/BucketSort.dart
@@ -1,5 +1,4 @@
 import 'ArrayGenerator.dart';
-import 'SortingHelper.dart';
 import 'dart:math';
 
 class BucketSort {
diff --git a/23-MSDSort-And-BucketSort/MSDSort.dart b/dart/23-MSDSort-And-BucketSort/MSDSort.dart
similarity index 100%
rename from 23-MSDSort-And-BucketSort/MSDSort.dart
rename to dart/23-MSDSort-And-BucketSort/MSDSort.dart
diff --git a/23-MSDSort-And-BucketSort/MergeSort.dart b/dart/23-MSDSort-And-BucketSort/MergeSort.dart
similarity index 100%
rename from 23-MSDSort-And-BucketSort/MergeSort.dart
rename to dart/23-MSDSort-And-BucketSort/MergeSort.dart
diff --git a/23-MSDSort-And-BucketSort/ShellSort.dart b/dart/23-MSDSort-And-BucketSort/ShellSort.dart
similarity index 100%
rename from 23-MSDSort-And-BucketSort/ShellSort.dart
rename to dart/23-MSDSort-And-BucketSort/ShellSort.dart
diff --git a/23-MSDSort-And-BucketSort/SortingHelper.dart b/dart/23-MSDSort-And-BucketSort/SortingHelper.dart
similarity index 96%
rename from 23-MSDSort-And-BucketSort/SortingHelper.dart
rename to dart/23-MSDSort-And-BucketSort/SortingHelper.dart
index 23e28d5..e437ed2 100644
--- a/23-MSDSort-And-BucketSort/SortingHelper.dart
+++ b/dart/23-MSDSort-And-BucketSort/SortingHelper.dart
@@ -43,6 +43,6 @@ class SortingHelper {
     print("开始时间：$startTime : 结束时间:$endTime");
     double time = (endTime - startTime) / 1000.0;
     if (!SortingHelper.isSorted(arr)) throw new Exception(sortname + " failed");
-    print("$sortname , n = ${arr!.length}: $time s");
+    print("$sortname , n = ${arr.length}: $time s");
   }
 }
diff --git a/24-SubString-Match/FileOperator.dart b/dart/24-SubString-Match/FileOperator.dart
similarity index 100%
rename from 24-SubString-Match/FileOperator.dart
rename to dart/24-SubString-Match/FileOperator.dart
diff --git a/24-SubString-Match/LC1392-hash.dart b/dart/24-SubString-Match/LC1392-hash.dart
similarity index 100%
rename from 24-SubString-Match/LC1392-hash.dart
rename to dart/24-SubString-Match/LC1392-hash.dart
diff --git a/24-SubString-Match/LC1392.dart b/dart/24-SubString-Match/LC1392.dart
similarity index 100%
rename from 24-SubString-Match/LC1392.dart
rename to dart/24-SubString-Match/LC1392.dart
diff --git a/24-SubString-Match/LC187-RollingHash.dart b/dart/24-SubString-Match/LC187-RollingHash.dart
similarity index 100%
rename from 24-SubString-Match/LC187-RollingHash.dart
rename to dart/24-SubString-Match/LC187-RollingHash.dart
diff --git a/24-SubString-Match/LC187.dart b/dart/24-SubString-Match/LC187.dart
similarity index 100%
rename from 24-SubString-Match/LC187.dart
rename to dart/24-SubString-Match/LC187.dart
diff --git a/24-SubString-Match/Solution.dart b/dart/24-SubString-Match/Solution.dart
similarity index 100%
rename from 24-SubString-Match/Solution.dart
rename to dart/24-SubString-Match/Solution.dart
diff --git a/24-SubString-Match/Solution2.dart b/dart/24-SubString-Match/Solution2.dart
similarity index 100%
rename from 24-SubString-Match/Solution2.dart
rename to dart/24-SubString-Match/Solution2.dart
diff --git a/24-SubString-Match/SubstringMatch.dart b/dart/24-SubString-Match/SubstringMatch.dart
similarity index 100%
rename from 24-SubString-Match/SubstringMatch.dart
rename to dart/24-SubString-Match/SubstringMatch.dart
diff --git a/24-SubString-Match/SubstringMatchHelper.dart b/dart/24-SubString-Match/SubstringMatchHelper.dart
similarity index 100%
rename from 24-SubString-Match/SubstringMatchHelper.dart
rename to dart/24-SubString-Match/SubstringMatchHelper.dart
diff --git a/24-SubString-Match/text1.txt b/dart/24-SubString-Match/text1.txt
similarity index 100%
rename from 24-SubString-Match/text1.txt
rename to dart/24-SubString-Match/text1.txt
diff --git a/24-SubString-Match/text2.txt b/dart/24-SubString-Match/text2.txt
similarity index 100%
rename from 24-SubString-Match/text2.txt
rename to dart/24-SubString-Match/text2.txt
diff --git a/dart/25-GraphBascis/AdjList.dart b/dart/25-GraphBascis/AdjList.dart
new file mode 100644
index 0000000..c331c75
--- /dev/null
+++ b/dart/25-GraphBascis/AdjList.dart
@@ -0,0 +1,96 @@
+import 'dart:collection';
+import 'dart:io';
+
+/**
+ * 图的邻接表
+ */
+class AdjList{
+  int? _V;//图的顶点数量
+  int? _E;//图的边的数量
+  List?  _adj;//邻接矩阵
+
+  AdjList( V,E,List list) {
+    _V = V;
+    _E = E ;
+    if(V < 0) throw Exception("V must be non-negative");
+    if(E < 0) throw Exception("E must be non-negative");
+    _adj = List.generate(V, (_)=> LinkedList<LinkedListEntryImpl<int>>(),growable: false);
+    for(int i =1;i<=E;i++){
+      int a =  int.parse(list[i].split(" ")[0]);
+      _validateVertex(a);
+      int b = int.parse(list[i].split(" ")[1]);
+      _validateVertex(b);
+      var currentLinkedEntryA = LinkedListEntryImpl<int>(a);
+      var currentLinkedEntryB = LinkedListEntryImpl<int>(b);
+
+      _adj![a].add(currentLinkedEntryB);
+      _adj![b].add(currentLinkedEntryA);
+    }
+  }
+
+  _validateVertex(int v){
+    if(v < 0 || v >= _V!)
+      throw new Exception("vertex  $v is invalid");
+  }
+
+  int? V(){
+    return _V;
+  }
+
+  bool hasEdge(int v, int w){
+    _validateVertex(v);
+    _validateVertex(w);
+    return (_adj![v] as LinkedList).contains(w);
+  }
+
+  int _degree(int v){
+    return _adj![v].length;
+  }
+
+  int? E(){
+    return _E;
+  }
+
+  adj(int v){
+    _validateVertex(v);
+    return _adj![v];
+  }
+
+  @override
+  String toString() {
+
+    StringBuffer sb = new StringBuffer();
+    sb.write("V = $_V, E = $_E\n");
+    for (int i = 0; i < _V!; i ++) {
+      sb.write("节点: $i ");
+      sb.write("${(_adj![i] as LinkedList).toString()} ");
+      sb.write('\n');
+    }
+    return sb.toString();
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]) ;
+  int e = int.parse(list[0].split(" ")[1]) ;
+//
+  AdjList adjList= AdjList(v, e, list);
+  print(adjList);
+
+}
+class LinkedListEntryImpl<int> extends LinkedListEntry<LinkedListEntryImpl<int>> {
+
+  final int value;
+
+  LinkedListEntryImpl(this.value);
+
+  @override
+  String toString() {
+    return "value is $value";
+  }
+}
\ No newline at end of file
diff --git a/dart/25-GraphBascis/AdjMatrix.dart b/dart/25-GraphBascis/AdjMatrix.dart
new file mode 100644
index 0000000..25b66ad
--- /dev/null
+++ b/dart/25-GraphBascis/AdjMatrix.dart
@@ -0,0 +1,90 @@
+import 'dart:io';
+
+/**
+ * 图的邻接矩阵表示方式
+ *
+ * 注：
+ * 先读取文件，将相应数据赋值
+ */
+class AdjMatrix {
+  int? _V;//图的顶点数量
+  int? _E;//图的边的数量
+  List?  _adj;//邻接矩阵
+
+
+  AdjMatrix( V,E,List list) {
+    _V = V;
+    _E = E ;
+    if(V < 0) throw Exception("V must be non-negative");
+    if(E < 0) throw Exception("E must be non-negative");
+    _adj = List.generate(V, (_)=>List.generate(V,(_)=> 0),growable: false);
+    for(int i =1;i<=E;i++){
+      int a =  int.parse(list[i].split(" ")[0]);
+      _validateVertex(a);
+      int b = int.parse(list[i].split(" ")[1]);
+      _validateVertex(b);
+      _adj![a][b] = 1;
+      _adj![b][a] = 1;
+    }
+  }
+
+  _validateVertex(int v){
+    if(v < 0 || v >= _V!)
+      throw new Exception("vertex  $v is invalid");
+  }
+
+  int? V(){
+    return _V;
+  }
+
+  bool hasEdge(int v, int w){
+    _validateVertex(v);
+    _validateVertex(w);
+    return _adj![v][w] == 1;
+  }
+
+  int _degree(int v){
+    return _adj![v].length;
+  }
+
+  int? E(){
+    return _E;
+  }
+
+  List<int> adj(int v){
+    _validateVertex(v);
+    List<int> res = List.filled(_V!, 0,growable: true);
+    for(int i = 0; i < _V!; i ++)
+      if(_adj![v][i] == 1)
+        res.add(i);
+    return res;
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("V = $_V, E = $_E\n");
+    for (int i = 0; i < _V!; i ++) {
+      for (int j = 0; j < _V!; j ++)
+        sb.write("${_adj![i][j]} ");
+      sb.write('\n');
+    }
+    return sb.toString();
+  }
+
+
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]) ;
+  int e = int.parse(list[0].split(" ")[1]) ;
+//
+  AdjMatrix adjMatrix = AdjMatrix(v, e, list);
+  print(adjMatrix);
+
+}
\ No newline at end of file
diff --git a/dart/25-GraphBascis/AdjSet.dart b/dart/25-GraphBascis/AdjSet.dart
new file mode 100644
index 0000000..c670f82
--- /dev/null
+++ b/dart/25-GraphBascis/AdjSet.dart
@@ -0,0 +1,81 @@
+import 'dart:collection';
+import 'dart:io';
+
+/**
+ * 图的邻接表
+ *
+ */
+class AdjSet {
+  int? _V; //图的顶点数量
+  int? _E; //图的边的数量
+  List? _treeSet;
+
+  AdjSet(V, E, List list) {
+    _V = V;
+    _E = E;
+    if (V < 0) throw Exception("V must be non-negative");
+    if (E < 0) throw Exception("E must be non-negative");
+    _treeSet = List.generate(V, (_) => SplayTreeSet<int>(), growable: false);
+
+    for (int i = 1; i <= E; i++) {
+      int a = int.parse(list[i].split(" ")[0]);
+      _validateVertex(a);
+      int b = int.parse(list[i].split(" ")[1]);
+      _validateVertex(b);
+      (_treeSet![a] as SplayTreeSet).add(b);
+      (_treeSet![b] as SplayTreeSet).add(a);
+    }
+  }
+
+  _validateVertex(int v) {
+    if (v < 0 || v >= _V!) throw new Exception("vertex  $v is invalid");
+  }
+
+  int? V() {
+    return _V;
+  }
+
+  bool hasEdge(int v, int w) {
+    _validateVertex(v);
+    _validateVertex(w);
+    return (_treeSet![v] as SplayTreeSet).elementAt(w) == 1;
+  }
+
+  int _degree(int v) {
+    return _treeSet![v].length;
+  }
+
+  int? E() {
+    return _E;
+  }
+
+  adj(int v) {
+    _validateVertex(v);
+    return _treeSet![v];
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("V = $_V, E = $_E\n");
+    for (int j = 0; j < _V!; j++) {
+      sb.write("节点：$j ");
+      sb.write("${_treeSet![j].toString()} ");
+      sb.write('\n');
+    }
+    return sb.toString();
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  AdjSet adjList = AdjSet(v, e, list);
+  print(adjList);
+}
diff --git a/dart/25-GraphBascis/FileOperator.dart b/dart/25-GraphBascis/FileOperator.dart
new file mode 100644
index 0000000..da2d7a4
--- /dev/null
+++ b/dart/25-GraphBascis/FileOperator.dart
@@ -0,0 +1,19 @@
+import 'dart:io';
+import 'dart:convert';
+
+/**
+ * 文件操作类
+ */
+class FileOperator{
+
+    static Future<List> getFileString(String filename) async{
+      Stream<List<int>> content = File(filename).openRead();
+      List<String> lines = await content.transform(utf8.decoder).transform(LineSplitter()).toList();
+      var words = [];
+      for(int i = 0;i<lines.length;i++){
+        words.addAll(lines[i].split(" ").toList());
+      }
+      words.removeWhere((element) => element == "");
+      return words;
+    }
+}
\ No newline at end of file
diff --git a/dart/25-GraphBascis/Graph.dart b/dart/25-GraphBascis/Graph.dart
new file mode 100644
index 0000000..66882d5
--- /dev/null
+++ b/dart/25-GraphBascis/Graph.dart
@@ -0,0 +1,76 @@
+import 'dart:collection';
+import 'dart:io';
+class Graph{
+  int? _V; //图的顶点数量
+  int? _E; //图的边的数量
+  List? _treeSet;
+
+  Graph(V, E, List list) {
+    _V = V;
+    _E = E;
+    if (V < 0) throw Exception("V must be non-negative");
+    if (E < 0) throw Exception("E must be non-negative");
+    _treeSet = List.generate(V, (_) => SplayTreeSet<int>(), growable: false);
+
+    for (int i = 1; i <= E; i++) {
+      int a = int.parse(list[i].split(" ")[0]);
+      _validateVertex(a);
+      int b = int.parse(list[i].split(" ")[1]);
+      _validateVertex(b);
+      (_treeSet![a] as SplayTreeSet).add(b);
+      (_treeSet![b] as SplayTreeSet).add(a);
+    }
+  }
+
+  _validateVertex(int v) {
+    if (v < 0 || v >= _V!) throw new Exception("vertex  $v is invalid");
+  }
+
+  int? V() {
+    return _V;
+  }
+
+  bool hasEdge(int v, int w) {
+    _validateVertex(v);
+    _validateVertex(w);
+    return (_treeSet![v] as SplayTreeSet).contains(w);
+  }
+
+  int _degree(int v) {
+    return _treeSet![v].length;
+  }
+
+  int? E() {
+    return _E;
+  }
+
+  adj(int v) {
+    _validateVertex(v);
+    return _treeSet![v];
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("V = $_V, E = $_E\n");
+    for (int j = 0; j < _V!; j++) {
+      sb.write("节点：$j ");
+      sb.write("${_treeSet![j].toString()} ");
+    sb.write('\n');
+    }
+    return sb.toString();
+  }
+}
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]) ;
+  int e = int.parse(list[0].split(" ")[1]) ;
+//
+  Graph adjList= Graph(v, e, list);
+  print(adjList);
+
+}
diff --git a/dart/25-GraphBascis/ListItem.dart b/dart/25-GraphBascis/ListItem.dart
new file mode 100644
index 0000000..45ad4c2
--- /dev/null
+++ b/dart/25-GraphBascis/ListItem.dart
@@ -0,0 +1,14 @@
+import 'dart:collection';
+
+class LinkedListEntryImpl<int> extends LinkedListEntry<LinkedListEntryImpl<int>> {
+  final int value;
+
+  LinkedListEntryImpl(this.value);
+
+  @override
+  String toString() {
+    return "value is $value";
+  }
+}
+
+
diff --git a/dart/25-GraphBascis/g.txt b/dart/25-GraphBascis/g.txt
new file mode 100644
index 0000000..8500b5a
--- /dev/null
+++ b/dart/25-GraphBascis/g.txt
@@ -0,0 +1,7 @@
+7 6
+0 1
+0 2
+1 3
+1 4
+2 3
+2 6
\ No newline at end of file
diff --git a/dart/26-GraphDFS/AdjMatrix.dart b/dart/26-GraphDFS/AdjMatrix.dart
new file mode 100644
index 0000000..25b66ad
--- /dev/null
+++ b/dart/26-GraphDFS/AdjMatrix.dart
@@ -0,0 +1,90 @@
+import 'dart:io';
+
+/**
+ * 图的邻接矩阵表示方式
+ *
+ * 注：
+ * 先读取文件，将相应数据赋值
+ */
+class AdjMatrix {
+  int? _V;//图的顶点数量
+  int? _E;//图的边的数量
+  List?  _adj;//邻接矩阵
+
+
+  AdjMatrix( V,E,List list) {
+    _V = V;
+    _E = E ;
+    if(V < 0) throw Exception("V must be non-negative");
+    if(E < 0) throw Exception("E must be non-negative");
+    _adj = List.generate(V, (_)=>List.generate(V,(_)=> 0),growable: false);
+    for(int i =1;i<=E;i++){
+      int a =  int.parse(list[i].split(" ")[0]);
+      _validateVertex(a);
+      int b = int.parse(list[i].split(" ")[1]);
+      _validateVertex(b);
+      _adj![a][b] = 1;
+      _adj![b][a] = 1;
+    }
+  }
+
+  _validateVertex(int v){
+    if(v < 0 || v >= _V!)
+      throw new Exception("vertex  $v is invalid");
+  }
+
+  int? V(){
+    return _V;
+  }
+
+  bool hasEdge(int v, int w){
+    _validateVertex(v);
+    _validateVertex(w);
+    return _adj![v][w] == 1;
+  }
+
+  int _degree(int v){
+    return _adj![v].length;
+  }
+
+  int? E(){
+    return _E;
+  }
+
+  List<int> adj(int v){
+    _validateVertex(v);
+    List<int> res = List.filled(_V!, 0,growable: true);
+    for(int i = 0; i < _V!; i ++)
+      if(_adj![v][i] == 1)
+        res.add(i);
+    return res;
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("V = $_V, E = $_E\n");
+    for (int i = 0; i < _V!; i ++) {
+      for (int j = 0; j < _V!; j ++)
+        sb.write("${_adj![i][j]} ");
+      sb.write('\n');
+    }
+    return sb.toString();
+  }
+
+
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]) ;
+  int e = int.parse(list[0].split(" ")[1]) ;
+//
+  AdjMatrix adjMatrix = AdjMatrix(v, e, list);
+  print(adjMatrix);
+
+}
\ No newline at end of file
diff --git a/dart/26-GraphDFS/AdjMatrixDFS.dart b/dart/26-GraphDFS/AdjMatrixDFS.dart
new file mode 100644
index 0000000..a39877a
--- /dev/null
+++ b/dart/26-GraphDFS/AdjMatrixDFS.dart
@@ -0,0 +1,61 @@
+import 'AdjMatrix.dart';
+import 'dart:io';
+
+/**
+ * 邻接矩阵的深度遍历
+ */
+class AdjMatrixDFS {
+  AdjMatrix? G;
+
+  List? visited;
+
+  List? preList;
+
+  List? postList;
+
+  AdjMatrixDFS(AdjMatrix G) {
+    this.G = G;
+    visited = List.filled(G.V()!, false, growable: true);
+    preList = List.filled(0, 0, growable: true);
+    postList = List.filled(0, 0, growable: true);
+    for (int v = 0; v < G.V()!; v++) {
+      if (!(visited![v])) {
+        _dfs(v);
+      }
+    }
+  }
+
+  _dfs(int v) {
+    visited![v] = true;
+    preList!.add(v);
+    for (int w in G!.adj(v)) {
+      if (!visited![w]) {
+        _dfs(w);
+      }
+    }
+    postList!.add(v);
+  }
+
+  pre() {
+    return preList;
+  }
+
+  post() {
+    return postList;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  AdjMatrix adjList = AdjMatrix(v, e, list);
+  AdjMatrixDFS graphDFS = new AdjMatrixDFS(adjList);
+  print("DFS preOrder :  ${graphDFS.pre()}");
+  print("DFS postOrder : ${graphDFS.post()}");
+}
diff --git a/dart/26-GraphDFS/ArrayStack.dart b/dart/26-GraphDFS/ArrayStack.dart
new file mode 100644
index 0000000..f219345
--- /dev/null
+++ b/dart/26-GraphDFS/ArrayStack.dart
@@ -0,0 +1,46 @@
+import 'Stack.dart';
+class ArrayStack<T> implements Stack<T>{
+
+  List? arr;
+  ArrayStack(){
+    arr =<dynamic>[];
+  }
+
+  @override
+  int getSize() {
+    return arr!.length;
+  }
+
+  @override
+  bool isEmpty() {
+    return arr!.isEmpty;
+  }
+
+  @override
+  T peek() {
+    return arr![0];
+  }
+
+  @override
+  T pop() => arr!.removeLast();
+
+  @override
+  void push(T e) {
+    arr!.add(e);
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("Stack: ");
+    buffer.write('[');
+    for(int i = 0 ; i < arr!.length ; i ++){
+      buffer.write(arr![i]);
+      if(i != arr!.length - 1)
+        buffer.write(", ");
+    }
+    buffer.write("] top");
+    return buffer.toString();
+  }
+
+}
\ No newline at end of file
diff --git a/dart/26-GraphDFS/Graph.dart b/dart/26-GraphDFS/Graph.dart
new file mode 100644
index 0000000..16bc1d5
--- /dev/null
+++ b/dart/26-GraphDFS/Graph.dart
@@ -0,0 +1,80 @@
+import 'dart:collection';
+import 'dart:io';
+
+/**
+ * 图
+ */
+class Graph{
+  int? _V; //图的顶点数量
+  int? _E; //图的边的数量
+  List? _treeSet;
+
+  Graph(V, E, List list) {
+    _V = V;
+    _E = E;
+    if (V < 0) throw Exception("V must be non-negative");
+    if (E < 0) throw Exception("E must be non-negative");
+    _treeSet = List.generate(V, (_) => SplayTreeSet<int>(), growable: false);
+
+    for (int i = 1; i <= E; i++) {
+      int a = int.parse(list[i].split(" ")[0]);
+      _validateVertex(a);
+      int b = int.parse(list[i].split(" ")[1]);
+      _validateVertex(b);
+      (_treeSet![a] as SplayTreeSet).add(b);
+      (_treeSet![b] as SplayTreeSet).add(a);
+    }
+  }
+
+  _validateVertex(int v) {
+    if (v < 0 || v >= _V!) throw new Exception("vertex  $v is invalid");
+  }
+
+  int? V() {
+    return _V;
+  }
+
+  bool hasEdge(int v, int w) {
+    _validateVertex(v);
+    _validateVertex(w);
+    return (_treeSet![v] as SplayTreeSet).contains(w);
+  }
+
+  int _degree(int v) {
+    return _treeSet![v].length;
+  }
+
+  int? E() {
+    return _E;
+  }
+
+  adj(int v) {
+    _validateVertex(v);
+    return _treeSet![v];
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("V = $_V, E = $_E\n");
+    for (int j = 0; j < _V!; j++) {
+      sb.write("节点：$j ");
+      sb.write("${_treeSet![j].toString()} ");
+    sb.write('\n');
+    }
+    return sb.toString();
+  }
+}
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]) ;
+  int e = int.parse(list[0].split(" ")[1]) ;
+//
+  Graph adjList= Graph(v, e, list);
+  print(adjList);
+
+}
diff --git a/dart/26-GraphDFS/GraphDFS.dart b/dart/26-GraphDFS/GraphDFS.dart
new file mode 100644
index 0000000..60a4b4e
--- /dev/null
+++ b/dart/26-GraphDFS/GraphDFS.dart
@@ -0,0 +1,61 @@
+import 'Graph.dart';
+import 'dart:io';
+
+/**
+ * 图的深度遍历
+ */
+class GraphDFS {
+  Graph? G;
+
+  List? visited;
+
+  List? preList;
+
+  List? postList;
+
+  GraphDFS(Graph G) {
+    this.G = G;
+    visited = List.filled(G.V()!, false, growable: true);
+    preList = List.filled(0, 0, growable: true);
+    postList = List.filled(0, 0, growable: true);
+    for (int v = 0; v < G.V()!; v++) {
+      if (!(visited![v])) {
+        _dfs(v);
+      }
+    }
+  }
+
+  _dfs(int v) {
+    visited![v] = true;
+    preList!.add(v);
+    for (int w in G!.adj(v)) {
+      if (!visited![w]) {
+        _dfs(w);
+      }
+    }
+    postList!.add(v);
+  }
+
+  pre() {
+    return preList;
+  }
+
+   post() {
+    return postList;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  Graph adjList = Graph(v, e, list);
+  GraphDFS graphDFS = new GraphDFS(adjList);
+  print("DFS preOrder :  ${graphDFS.pre()}" );
+  print("DFS postOrder : ${graphDFS.post()}");
+}
diff --git a/dart/26-GraphDFS/GraphDFSnr.dart b/dart/26-GraphDFS/GraphDFSnr.dart
new file mode 100644
index 0000000..8fae5ef
--- /dev/null
+++ b/dart/26-GraphDFS/GraphDFSnr.dart
@@ -0,0 +1,56 @@
+import 'Graph.dart';
+import 'dart:io';
+import 'Stack.dart';
+import 'ArrayStack.dart';
+
+class GraphDFSnr {
+  Graph? G;
+
+  List? visited;
+
+  List? preList;
+
+  GraphDFSnr(Graph G) {
+    this.G = G;
+    visited = List.filled(G.V()!, false, growable: true);
+    preList = List.filled(0, 0, growable: true);
+    for (int v = 0; v < G.V()!; v++) {
+      if (!(visited![v])) {
+        _dfs(v);
+      }
+    }
+  }
+
+  _dfs(int v) {
+    ArrayStack stack = ArrayStack();
+    stack.push(v);
+    visited![v] = true;
+    while (!stack.isEmpty()) {
+      int cur = stack.pop();
+      preList!.add(cur);
+      for (int w in G!.adj(cur))
+        if (!visited![w]) {
+          stack.push(w);
+          visited![w] = true;
+        }
+    }
+  }
+
+  pre() {
+    return preList;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  Graph adjList = Graph(v, e, list);
+  GraphDFSnr graphDFS = new GraphDFSnr(adjList);
+  print("DFS preOrder :  ${graphDFS.pre()}");
+}
diff --git a/dart/26-GraphDFS/Stack.dart b/dart/26-GraphDFS/Stack.dart
new file mode 100644
index 0000000..1af8f57
--- /dev/null
+++ b/dart/26-GraphDFS/Stack.dart
@@ -0,0 +1,7 @@
+abstract class Stack<T>{
+  int getSize();
+  bool isEmpty();
+  void push(T e);
+  T pop();
+  T peek();
+}
\ No newline at end of file
diff --git a/dart/26-GraphDFS/g.txt b/dart/26-GraphDFS/g.txt
new file mode 100644
index 0000000..8500b5a
--- /dev/null
+++ b/dart/26-GraphDFS/g.txt
@@ -0,0 +1,7 @@
+7 6
+0 1
+0 2
+1 3
+1 4
+2 3
+2 6
\ No newline at end of file
diff --git a/dart/27-GraphDFS-Application/BipartitionDetection.dart b/dart/27-GraphDFS-Application/BipartitionDetection.dart
new file mode 100644
index 0000000..22fc2d8
--- /dev/null
+++ b/dart/27-GraphDFS-Application/BipartitionDetection.dart
@@ -0,0 +1,79 @@
+import 'Graph.dart';
+import 'dart:io';
+/**
+ * 二分图检测
+ */
+class BipartitionDetection {
+  Graph? _G;
+
+  List? _visited;
+
+  List? _colors;
+
+  bool _isBipartite = true;
+
+  BipartitionDetection(Graph G) {
+    this._G = G;
+    _visited = List.filled(_G!.V()!, false, growable: true);
+    _colors = List.filled(_G!.V()!, 0, growable: true);
+    for (int i = 0; i < _G!.V()!; i++) _colors![i] = -1;
+
+    for (int v = 0; v < _G!.V()!; v++)
+      if (!_visited![v]) if (!_dfs(v, 0)) {
+        _isBipartite = false;
+        break;
+      }
+  }
+
+  bool _dfs(int v, int color) {
+    _visited![v] = true;
+    _colors![v] = color;
+    for (int w in _G!.adj(v))
+      if (!_visited![w]) {
+        if (!_dfs(w, 1 - color)) return false;
+      } else if (_colors![w] == _colors![v]) return false;
+    return true;
+  }
+
+  bool isBipartite() {
+    return _isBipartite;
+  }
+}
+void main()async{
+  print("------------------txt1");
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  Graph graph = Graph(v, e, list);
+
+  BipartitionDetection bipartitionDetection = BipartitionDetection(graph);
+  print(bipartitionDetection.isBipartite());
+print("------------------txt2");
+  File content2 = File("g2.txt");
+  List<String> list2 = await content2.readAsLines();
+  //读取到文件的顶点数量以及
+  int v2 = int.parse(list2[0].split(" ")[0]);
+  int e2 = int.parse(list2[0].split(" ")[1]);
+//
+  Graph graph2 = Graph(v2, e2, list2);
+
+  BipartitionDetection bipartitionDetection2 = BipartitionDetection(graph2);
+  print(bipartitionDetection2.isBipartite());
+  print("------------------txt3");
+
+  File content3 = File("g3.txt");
+  List<String> list3 = await content3.readAsLines();
+  //读取到文件的顶点数量以及
+  int v3 = int.parse(list3[0].split(" ")[0]);
+  int e3 = int.parse(list3[0].split(" ")[1]);
+//
+  Graph graph3 = Graph(v3, e3, list3);
+
+  BipartitionDetection bipartitionDetection3 = BipartitionDetection(graph3);
+  print(bipartitionDetection3.isBipartite());
+
+
+}
diff --git a/dart/27-GraphDFS-Application/CC.dart b/dart/27-GraphDFS-Application/CC.dart
new file mode 100644
index 0000000..33aa495
--- /dev/null
+++ b/dart/27-GraphDFS-Application/CC.dart
@@ -0,0 +1,80 @@
+import 'Graph.dart';
+import 'dart:io';
+
+/**
+ * 图的联通分量
+ */
+class CC{
+  Graph? G;
+
+  List? _visited;
+  int _cccount = 0;
+
+  CC(Graph G) {
+    this.G = G;
+    _visited = List.filled(G.V()!, 0, growable: true);
+
+    for(int i = 0; i < _visited!.length; i ++)
+      _visited![i] = -1;
+
+    for (int v = 0; v < G.V()!; v++) {
+      if (_visited![v] == -1) {
+        _dfs(v,_cccount);
+        _cccount ++;
+      }
+    }
+  }
+
+  _dfs(int v, int ccid) {
+    _visited![v] = ccid;
+    for (int w in G!.adj(v)) {
+      if (_visited![w] == -1) {
+        _dfs(w,ccid);
+      }
+    }
+  }
+
+  int count(){
+    return _cccount;
+  }
+
+  bool isConnected(int v, int w){
+    G!.validateVertex(v);
+    G!.validateVertex(w);
+    return _visited![v] == _visited![w];
+  }
+
+  components(){
+    List? res =List.generate(_cccount, (_)=>List.generate(0,(_)=> 0),growable: true);
+    for(int v = 0; v < G!.V()!; v ++)
+      res[_visited![v]].add(v);
+    return res;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]) ;
+  int e = int.parse(list[0].split(" ")[1]) ;
+//
+  Graph adjList= Graph(v, e, list);
+  CC cc = new CC(adjList);
+  print(cc.count());
+
+  print(cc.isConnected(0, 6));
+  print(cc.isConnected(5, 6));
+
+  List comp = cc.components();
+  for(int ccid = 0; ccid < comp.length; ccid ++){
+    print("$ccid  :: ");
+    for(int w in  comp[ccid]) {
+      print("$w ");
+    }
+    print("");
+  }
+
+  print(adjList);
+
+}
\ No newline at end of file
diff --git a/dart/27-GraphDFS-Application/CycleDetection.dart b/dart/27-GraphDFS-Application/CycleDetection.dart
new file mode 100644
index 0000000..c3f2e4b
--- /dev/null
+++ b/dart/27-GraphDFS-Application/CycleDetection.dart
@@ -0,0 +1,65 @@
+import 'Graph.dart';
+import 'dart:io';
+/**
+ * 无向图的环检测
+ */
+class CycleDetection {
+  Graph? _G;
+
+  List? _visited;
+
+  bool _hasCycle = false;
+
+  CycleDetection(Graph G) {
+    this._G = G;
+    _visited = List.filled(_G!.V()!, false, growable: true);
+    for (int v = 0; v < _G!.V()!; v++)
+      if (!_visited![v]) if (_dfs(v, v)) {
+        _hasCycle = true;
+        break;
+      }
+  }
+
+  // 从顶点 v 开始，判断图中是否有环
+  bool _dfs(int v, int parent) {
+    _visited![v] = true;
+    for (int w in _G!.adj(v))
+      if (!_visited![w]) {
+        if (_dfs(w, v)) return true;
+      } else if (w != parent) return true;
+    return false;
+  }
+
+  bool hasCycle() {
+    return _hasCycle;
+  }
+}
+
+void main () async{
+
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  Graph graph = Graph(v, e, list);
+
+  CycleDetection cycleDetection = CycleDetection(graph);
+  print(cycleDetection.hasCycle());
+
+  File content2 = File("g2.txt");
+  List<String> list2 = await content2.readAsLines();
+  //读取到文件的顶点数量以及
+  int v2 = int.parse(list2[0].split(" ")[0]);
+  int e2 = int.parse(list2[0].split(" ")[1]);
+//
+  Graph graph2 = Graph(v2, e2, list2);
+
+  CycleDetection cycleDetection2 = CycleDetection(graph2);
+  print(cycleDetection2.hasCycle());
+
+
+}
+
+
diff --git a/dart/27-GraphDFS-Application/Graph.dart b/dart/27-GraphDFS-Application/Graph.dart
new file mode 100644
index 0000000..0d44faa
--- /dev/null
+++ b/dart/27-GraphDFS-Application/Graph.dart
@@ -0,0 +1,80 @@
+import 'dart:collection';
+import 'dart:io';
+
+/**
+ * 图
+ */
+class Graph{
+  int? _V; //图的顶点数量
+  int? _E; //图的边的数量
+  List? _treeSet;
+
+  Graph(V, E, List list) {
+    _V = V;
+    _E = E;
+    if (V < 0) throw Exception("V must be non-negative");
+    if (E < 0) throw Exception("E must be non-negative");
+    _treeSet = List.generate(V, (_) => SplayTreeSet<int>(), growable: false);
+
+    for (int i = 1; i <= E; i++) {
+      int a = int.parse(list[i].split(" ")[0]);
+      validateVertex(a);
+      int b = int.parse(list[i].split(" ")[1]);
+      validateVertex(b);
+      (_treeSet![a] as SplayTreeSet).add(b);
+      (_treeSet![b] as SplayTreeSet).add(a);
+    }
+  }
+
+  validateVertex(int v) {
+    if (v < 0 || v >= _V!) throw new Exception("vertex  $v is invalid");
+  }
+
+  int? V() {
+    return _V;
+  }
+
+  bool hasEdge(int v, int w) {
+    validateVertex(v);
+    validateVertex(w);
+    return (_treeSet![v] as SplayTreeSet).contains(w);
+  }
+
+  int _degree(int v) {
+    return _treeSet![v].length;
+  }
+
+  int? E() {
+    return _E;
+  }
+
+  adj(int v) {
+    validateVertex(v);
+    return _treeSet![v];
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("V = $_V, E = $_E\n");
+    for (int j = 0; j < _V!; j++) {
+      sb.write("节点：$j ");
+      sb.write("${_treeSet![j].toString()} ");
+    sb.write('\n');
+    }
+    return sb.toString();
+  }
+}
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]) ;
+  int e = int.parse(list[0].split(" ")[1]) ;
+//
+  Graph adjList= Graph(v, e, list);
+  print(adjList);
+
+}
diff --git a/dart/27-GraphDFS-Application/GraphDFS.dart b/dart/27-GraphDFS-Application/GraphDFS.dart
new file mode 100644
index 0000000..2142237
--- /dev/null
+++ b/dart/27-GraphDFS-Application/GraphDFS.dart
@@ -0,0 +1,59 @@
+import 'Graph.dart';
+import 'dart:io';
+
+/**
+ * 图的深度遍历
+ */
+class GraphDFS {
+  Graph? G;
+
+  List? _visited;
+
+  List? _preList;
+
+  List? _postList;
+
+  GraphDFS(Graph G) {
+    this.G = G;
+    _visited = List.filled(G.V()!, false, growable: true);
+    _preList = List.filled(0, 0, growable: true);
+    _postList = List.filled(0, 0, growable: true);
+    for (int v = 0; v < G.V()!; v++) {
+      if (!(_visited![v])) {
+        _dfs(v);
+      }
+    }
+  }
+
+  _dfs(int v) {
+    _visited![v] = true;
+    _preList!.add(v);
+    for (int w in G!.adj(v)) {
+      if (!_visited![w]) {
+        _dfs(w);
+      }
+    }
+    _postList!.add(v);
+  }
+
+  pre() {
+    return _preList;
+  }
+
+   post() {
+    return _postList;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  Graph adjList = Graph(v, e, list);
+  GraphDFS graphDFS = new GraphDFS(adjList);
+  print("DFS preOrder :  ${graphDFS.pre()}" );
+  print("DFS postOrder : ${graphDFS.post()}");
+}
diff --git a/dart/27-GraphDFS-Application/SingleSourcePath.dart b/dart/27-GraphDFS-Application/SingleSourcePath.dart
new file mode 100644
index 0000000..233ac86
--- /dev/null
+++ b/dart/27-GraphDFS-Application/SingleSourcePath.dart
@@ -0,0 +1,65 @@
+import 'Graph.dart';
+import 'dart:io';
+/**
+ * 单源路径问题
+ *
+ */
+class SingleSourcePath {
+  Graph? _G;
+
+  int? _s;
+
+  List? pre;
+
+  SingleSourcePath(Graph G, int s) {
+    this._G = G;
+    this._s = s;
+    pre = List.filled(_G!.V()!, 0, growable: true);
+    for (int i = 0; i < pre!.length; i++) {
+      pre![i] = -1;
+    }
+    _dfs(s, s);
+  }
+
+  _dfs(int v, int parent) {
+    pre![v] = parent;
+    for (int w in _G!.adj(v)) {
+      if (pre![w] == -1) {
+        _dfs(w, v);
+      }
+    }
+  }
+
+  bool isConnectedTo(int t) {
+    _G!.validateVertex(t);
+    return pre![t] != -1;
+  }
+
+  path(int t) {
+    List res = List.filled(0, 0, growable: true);
+    if (!isConnectedTo(t)) return res;
+
+    int cur = t;
+    while (cur != _s) {
+      res.add(cur);
+      cur = pre![cur];
+    }
+    res.add(_s);
+    var result  = res.reversed;
+    return result;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]) ;
+  int e = int.parse(list[0].split(" ")[1]) ;
+//
+  Graph graph= Graph(v, e, list);
+  SingleSourcePath sspath = new SingleSourcePath(graph, 0);
+
+  print("0 -> 6 : ${sspath.path(6)}");
+  print("0 -> 5 : ${sspath.path(5)}");
+}
diff --git a/dart/27-GraphDFS-Application/g.txt b/dart/27-GraphDFS-Application/g.txt
new file mode 100644
index 0000000..8500b5a
--- /dev/null
+++ b/dart/27-GraphDFS-Application/g.txt
@@ -0,0 +1,7 @@
+7 6
+0 1
+0 2
+1 3
+1 4
+2 3
+2 6
\ No newline at end of file
diff --git a/dart/27-GraphDFS-Application/g2.txt b/dart/27-GraphDFS-Application/g2.txt
new file mode 100644
index 0000000..6a3b456
--- /dev/null
+++ b/dart/27-GraphDFS-Application/g2.txt
@@ -0,0 +1,6 @@
+7 5
+0 1
+0 2
+1 3
+1 4
+2 6
diff --git a/dart/27-GraphDFS-Application/g3.txt b/dart/27-GraphDFS-Application/g3.txt
new file mode 100644
index 0000000..a50c8b8
--- /dev/null
+++ b/dart/27-GraphDFS-Application/g3.txt
@@ -0,0 +1,5 @@
+4 4
+0 1
+0 3
+1 2
+2 3
\ No newline at end of file
diff --git a/dart/28-Graph-BFS/BipartitionDetection.dart b/dart/28-Graph-BFS/BipartitionDetection.dart
new file mode 100644
index 0000000..da8acb3
--- /dev/null
+++ b/dart/28-Graph-BFS/BipartitionDetection.dart
@@ -0,0 +1,88 @@
+import 'Graph.dart';
+import 'dart:io';
+import 'dart:collection';
+
+/**
+ * 二分图检测BFS方法
+ */
+class BipartitionDetection {
+  Graph? _G;
+
+  List? _visited;
+
+  List? _colors;
+
+  bool _isBipartite = true;
+
+  BipartitionDetection(Graph G) {
+    this._G = G;
+    _visited = List.filled(_G!.V()!, false, growable: true);
+    _colors = List.filled(_G!.V()!, 0, growable: true);
+    for (int i = 0; i < _G!.V()!; i++) _colors![i] = -1;
+
+    for (int v = 0; v < _G!.V()!; v++)
+      if (!_visited![v]) if (!_bfs(v, 0)) {
+        _isBipartite = false;
+        break;
+      }
+  }
+
+  bool _bfs(int v, int color) {
+    ListQueue queue = ListQueue();
+    queue.add(v);
+    _visited![v] = true;
+    _colors![v] = 0;
+    while (!queue.isEmpty) {
+      int v = queue.removeFirst();
+
+      for (int w in _G!.adj(v))
+        if (!_visited![w]) {
+          queue.add(w);
+          _visited![w] = true;
+          _colors![w] = 1 - _colors![v];
+        } else if (_colors![v] == _colors![w]) return false;
+    }
+    return true;
+  }
+
+  bool isBipartite() {
+    return _isBipartite;
+  }
+}
+
+void main() async {
+  print("------------------txt1");
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  Graph graph = Graph(v, e, list);
+
+  BipartitionDetection bipartitionDetection = BipartitionDetection(graph);
+  print(bipartitionDetection.isBipartite());
+  print("------------------txt2");
+  File content2 = File("g2.txt");
+  List<String> list2 = await content2.readAsLines();
+  //读取到文件的顶点数量以及
+  int v2 = int.parse(list2[0].split(" ")[0]);
+  int e2 = int.parse(list2[0].split(" ")[1]);
+//
+  Graph graph2 = Graph(v2, e2, list2);
+
+  BipartitionDetection bipartitionDetection2 = BipartitionDetection(graph2);
+  print(bipartitionDetection2.isBipartite());
+  print("------------------txt3");
+
+  File content3 = File("g3.txt");
+  List<String> list3 = await content3.readAsLines();
+  //读取到文件的顶点数量以及
+  int v3 = int.parse(list3[0].split(" ")[0]);
+  int e3 = int.parse(list3[0].split(" ")[1]);
+//
+  Graph graph3 = Graph(v3, e3, list3);
+
+  BipartitionDetection bipartitionDetection3 = BipartitionDetection(graph3);
+  print(bipartitionDetection3.isBipartite());
+}
diff --git a/dart/28-Graph-BFS/CC.dart b/dart/28-Graph-BFS/CC.dart
new file mode 100644
index 0000000..21a6891
--- /dev/null
+++ b/dart/28-Graph-BFS/CC.dart
@@ -0,0 +1,85 @@
+import 'Graph.dart';
+import 'dart:io';
+import 'dart:collection';
+
+/**
+ * 图的联通分量BFS
+ */
+class CC {
+  Graph? _G;
+
+  List? _visited;
+
+  int _cccount = 0;
+
+  CC(Graph G) {
+    this._G = G;
+    _visited = List.filled(G.V()!, 0, growable: true);
+
+    for (int i = 0; i < _visited!.length; i++) _visited![i] = -1;
+
+    for (int v = 0; v < G.V()!; v++) {
+      if (_visited![v] == -1) {
+        _bfs(v, _cccount);
+        _cccount++;
+      }
+    }
+  }
+
+  _bfs(int v, int ccid) {
+    ListQueue queue = ListQueue();
+    queue.add(v);
+    _visited![v] = ccid;
+    while (!queue.isEmpty) {
+      int v = queue.removeFirst();
+
+      for (int w in _G!.adj(v)) {
+        if (_visited![w] == -1) {
+          queue.add(w);
+          _visited![w] = ccid;
+        }
+      }
+    }
+  }
+
+  int count() {
+    return _cccount;
+  }
+
+  bool isConnected(int v, int w) {
+    _G!.validateVertex(v);
+    _G!.validateVertex(w);
+    return _visited![v] == _visited![w];
+  }
+
+  components() {
+    List? res = List.generate(_cccount, (_) => List.generate(0, (_) => 0),
+        growable: true);
+    for (int v = 0; v < _G!.V()!; v++) res[_visited![v]].add(v);
+    return res;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  Graph adjList = Graph(v, e, list);
+  CC cc = new CC(adjList);
+  print(cc.count());
+
+  print(cc.isConnected(0, 6));
+  print(cc.isConnected(5, 6));
+
+  List comp = cc.components();
+  for (int ccid = 0; ccid < comp.length; ccid++) {
+    print("$ccid  :: ");
+    for (int w in comp[ccid]) {
+      print("$w ");
+    }
+    print("");
+  }
+}
diff --git a/dart/28-Graph-BFS/CycleDetection.dart b/dart/28-Graph-BFS/CycleDetection.dart
new file mode 100644
index 0000000..dcd46c0
--- /dev/null
+++ b/dart/28-Graph-BFS/CycleDetection.dart
@@ -0,0 +1,81 @@
+import 'Graph.dart';
+import 'dart:io';
+import 'dart:collection';
+
+/**
+ * 无向图的环检测BFS问题
+ */
+class CycleDetection {
+  Graph? _G;
+
+  List? _visited;
+
+  bool _hasCycle = false;
+
+  List? _pre;
+
+  CycleDetection(Graph G) {
+    this._G = G;
+    _visited = List.filled(_G!.V()!, false, growable: true);
+    _pre = List.filled(_G!.V()!, 0, growable: true);
+    for (int i = 0; i < _G!.V()!; i++) {
+      _pre![i] = -1;
+    }
+    for (int v = 0; v < _G!.V()!; v++) {
+      if (!_visited![v]) {
+        if (_bfs(v, v)) {
+          _hasCycle = true;
+          break;
+        }
+      }
+    }
+  }
+
+  // 从顶点 v 开始，判断图中是否有环
+  bool _bfs(int v, int parent) {
+    ListQueue queue = ListQueue();
+    queue.add(v);
+    _visited![v] = true;
+    _pre![v] = v;
+    while (!queue.isEmpty) {
+      int v = queue.removeFirst();
+
+      for (int w in _G!.adj(v))
+        if (!_visited![w]) {
+          queue.add(w);
+          _visited![w] = true;
+          _pre![w] = v;
+        } else if (_pre![v] != w) return true;
+    }
+
+    return false;
+  }
+
+  bool hasCycle() {
+    return _hasCycle;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  Graph graph = Graph(v, e, list);
+
+  CycleDetection cycleDetection = CycleDetection(graph);
+  print(cycleDetection.hasCycle());
+
+  File content2 = File("g2.txt");
+  List<String> list2 = await content2.readAsLines();
+  //读取到文件的顶点数量以及
+  int v2 = int.parse(list2[0].split(" ")[0]);
+  int e2 = int.parse(list2[0].split(" ")[1]);
+//
+  Graph graph2 = Graph(v2, e2, list2);
+
+  CycleDetection cycleDetection2 = CycleDetection(graph2);
+  print(cycleDetection2.hasCycle());
+}
diff --git a/dart/28-Graph-BFS/Graph.dart b/dart/28-Graph-BFS/Graph.dart
new file mode 100644
index 0000000..0d44faa
--- /dev/null
+++ b/dart/28-Graph-BFS/Graph.dart
@@ -0,0 +1,80 @@
+import 'dart:collection';
+import 'dart:io';
+
+/**
+ * 图
+ */
+class Graph{
+  int? _V; //图的顶点数量
+  int? _E; //图的边的数量
+  List? _treeSet;
+
+  Graph(V, E, List list) {
+    _V = V;
+    _E = E;
+    if (V < 0) throw Exception("V must be non-negative");
+    if (E < 0) throw Exception("E must be non-negative");
+    _treeSet = List.generate(V, (_) => SplayTreeSet<int>(), growable: false);
+
+    for (int i = 1; i <= E; i++) {
+      int a = int.parse(list[i].split(" ")[0]);
+      validateVertex(a);
+      int b = int.parse(list[i].split(" ")[1]);
+      validateVertex(b);
+      (_treeSet![a] as SplayTreeSet).add(b);
+      (_treeSet![b] as SplayTreeSet).add(a);
+    }
+  }
+
+  validateVertex(int v) {
+    if (v < 0 || v >= _V!) throw new Exception("vertex  $v is invalid");
+  }
+
+  int? V() {
+    return _V;
+  }
+
+  bool hasEdge(int v, int w) {
+    validateVertex(v);
+    validateVertex(w);
+    return (_treeSet![v] as SplayTreeSet).contains(w);
+  }
+
+  int _degree(int v) {
+    return _treeSet![v].length;
+  }
+
+  int? E() {
+    return _E;
+  }
+
+  adj(int v) {
+    validateVertex(v);
+    return _treeSet![v];
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("V = $_V, E = $_E\n");
+    for (int j = 0; j < _V!; j++) {
+      sb.write("节点：$j ");
+      sb.write("${_treeSet![j].toString()} ");
+    sb.write('\n');
+    }
+    return sb.toString();
+  }
+}
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]) ;
+  int e = int.parse(list[0].split(" ")[1]) ;
+//
+  Graph adjList= Graph(v, e, list);
+  print(adjList);
+
+}
diff --git a/dart/28-Graph-BFS/GraphBFS.dart b/dart/28-Graph-BFS/GraphBFS.dart
new file mode 100644
index 0000000..16adac3
--- /dev/null
+++ b/dart/28-Graph-BFS/GraphBFS.dart
@@ -0,0 +1,56 @@
+import 'Graph.dart';
+import 'dart:collection';
+import 'dart:io';
+/**
+ * 图的广度优先遍历
+ */
+class GraphBFS {
+  Graph? G;
+
+  List? _visited;
+
+  List? _orderList = List.filled(0,0, growable: true);
+
+  GraphBFS(Graph G) {
+    this.G = G;
+    _visited = List.filled(G.V()!, false, growable: true);
+    for (int v = 0; v < G.V()!; v++) {
+      if (!(_visited![v])) {
+        _bfs(v);
+      }
+    }
+  }
+
+  _bfs(int v) {
+    ListQueue queue = ListQueue();
+    queue.add(v);
+    _visited![v] = true;
+    while (!queue.isEmpty) {
+      int v = queue.removeFirst();
+      _orderList!.add(v);
+      for (int w in G!.adj(v)) {
+        if (!_visited![w]) {
+          queue.add(w);
+          _visited![w] = true;
+        }
+      }
+    }
+  }
+
+  order() {
+    return _orderList;
+  }
+}
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  Graph adjList = Graph(v, e, list);
+  GraphBFS graphDFS = new GraphBFS(adjList);
+  print("BFS Order :  ${graphDFS.order()}" );
+}
\ No newline at end of file
diff --git a/dart/28-Graph-BFS/SingleSourcePath.dart b/dart/28-Graph-BFS/SingleSourcePath.dart
new file mode 100644
index 0000000..e22b2ef
--- /dev/null
+++ b/dart/28-Graph-BFS/SingleSourcePath.dart
@@ -0,0 +1,77 @@
+import 'Graph.dart';
+import 'dart:io';
+import 'dart:collection';
+
+/**
+ * 单源路径BFS问题
+ *
+ */
+class SingleSourcePath {
+  Graph? _G;
+
+  int? _s;
+
+  List? pre;
+
+  List? _visited;
+
+  SingleSourcePath(Graph G, int s) {
+    this._G = G;
+    this._s = s;
+    pre = List.filled(_G!.V()!, 0, growable: true);
+    _visited = List.filled(G.V()!, false, growable: true);
+    for (int i = 0; i < pre!.length; i++) {
+      pre![i] = -1;
+    }
+    _bfs(s);
+  }
+
+  _bfs(int v) {
+    ListQueue queue = ListQueue();
+    queue.add(v);
+    _visited![v] = true;
+    pre![v] = v;
+    while (!queue.isEmpty) {
+      int v = queue.removeFirst();
+
+      for (int w in _G!.adj(v))
+        if (!_visited![w]) {
+          queue.add(w);
+          _visited![w] = true;
+          pre![w] = v;
+        }
+    }
+  }
+
+  bool isConnectedTo(int t) {
+    _G!.validateVertex(t);
+    return pre![t] != -1;
+  }
+
+  path(int t) {
+    List res = List.filled(0, 0, growable: true);
+    if (!isConnectedTo(t)) return res;
+
+    int cur = t;
+    while (cur != _s) {
+      res.add(cur);
+      cur = pre![cur];
+    }
+    res.add(_s);
+    var result = res.reversed;
+    return result;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  Graph graph = Graph(v, e, list);
+  SingleSourcePath sspath = new SingleSourcePath(graph, 0);
+
+  print("0 -> 6 : ${sspath.path(6)}");
+}
diff --git a/dart/28-Graph-BFS/g.txt b/dart/28-Graph-BFS/g.txt
new file mode 100644
index 0000000..8500b5a
--- /dev/null
+++ b/dart/28-Graph-BFS/g.txt
@@ -0,0 +1,7 @@
+7 6
+0 1
+0 2
+1 3
+1 4
+2 3
+2 6
\ No newline at end of file
diff --git a/dart/28-Graph-BFS/g2.txt b/dart/28-Graph-BFS/g2.txt
new file mode 100644
index 0000000..6a3b456
--- /dev/null
+++ b/dart/28-Graph-BFS/g2.txt
@@ -0,0 +1,6 @@
+7 5
+0 1
+0 2
+1 3
+1 4
+2 6
diff --git a/dart/28-Graph-BFS/g3.txt b/dart/28-Graph-BFS/g3.txt
new file mode 100644
index 0000000..a50c8b8
--- /dev/null
+++ b/dart/28-Graph-BFS/g3.txt
@@ -0,0 +1,5 @@
+4 4
+0 1
+0 3
+1 2
+2 3
\ No newline at end of file
diff --git a/dart/29-Brigde-And-Cut-Points/Edge.dart b/dart/29-Brigde-And-Cut-Points/Edge.dart
new file mode 100644
index 0000000..3bee4ab
--- /dev/null
+++ b/dart/29-Brigde-And-Cut-Points/Edge.dart
@@ -0,0 +1,12 @@
+class Edge {
+  int? v, w;
+  Edge(int v, int w){
+    this.v = v;
+    this.w = w;
+  }
+
+  @override
+  String toString(){
+    return ("$v-$w");
+  }
+}
\ No newline at end of file
diff --git a/dart/29-Brigde-And-Cut-Points/FindBridges.dart b/dart/29-Brigde-And-Cut-Points/FindBridges.dart
new file mode 100644
index 0000000..a3bf627
--- /dev/null
+++ b/dart/29-Brigde-And-Cut-Points/FindBridges.dart
@@ -0,0 +1,108 @@
+import 'Graph.dart';
+import 'Edge.dart';
+import 'dart:io';
+import 'dart:math';
+
+/**
+ * 查找桥
+ */
+class FindBridges {
+  Graph? _G;
+
+  List? _visited;
+
+  List? _ord;
+
+  List? _low;
+
+  int cnt = 0;
+
+  List? res;
+
+  FindBridges(Graph G) {
+    this._G = G;
+    _visited = List.filled(G.V()!, false, growable: true);
+
+    res = List.filled(0, Edge, growable: true);
+    _ord = List.filled(G.V()!, 0, growable: true);
+    _low = List.filled(G.V()!, 0, growable: true);
+    cnt = 0;
+
+    for (int v = 0; v < _G!.V()!; v++) {
+      if (!_visited![v]) {
+        _dfs(v, v);
+      }
+    }
+  }
+
+  _dfs(int v, int parent) {
+    _visited![v] = true;
+    _ord![v] = cnt;
+    _low![v] = _ord![v];
+    cnt++;
+//    print("循环：${_G!.adj(v)}");
+    for (int w in _G!.adj(v))
+      if (!_visited![w]) {
+        _dfs(w, v);
+        _low![v] = [(_low![v] as int), (_low![w] as int)].reduce(min);
+//        print(" 最小值：${_low![v]}");
+        if (_low![w] > _ord![v]) {
+          res!.add(Edge(v, w));
+        }
+      } else if (w != parent) {
+        _low![v] = [(_low![v] as int), (_low![w] as int)].reduce(min);
+      }
+  }
+
+  result() {
+    return res;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+  Graph graph = Graph(v, e, list);
+
+  FindBridges fb = new FindBridges(graph);
+  print("Bridges in g : " + fb.result().toString());
+
+  File content2 = File("g2.txt");
+  List<String> list2 = await content2.readAsLines();
+  //读取到文件的顶点数量以及
+  int v2 = int.parse(list2[0].split(" ")[0]);
+  int e2 = int.parse(list2[0].split(" ")[1]);
+  Graph graph2 = Graph(v2, e2, list2);
+  FindBridges fb2 = new FindBridges(graph2);
+  print("Bridges in g2 : " + fb2.result().toString());
+
+  File content3 = File("g3.txt");
+  List<String> list3 = await content3.readAsLines();
+  //读取到文件的顶点数量以及
+  int v3 = int.parse(list3[0].split(" ")[0]);
+  int e3 = int.parse(list3[0].split(" ")[1]);
+  Graph graph3 = Graph(v3, e3, list3);
+  FindBridges fb3 = new FindBridges(graph3);
+  print("Bridges in g3 : " + fb3.result().toString());
+
+  File content4 = File("g4.txt");
+  List<String> list4 = await content4.readAsLines();
+  //读取到文件的顶点数量以及
+  int v4 = int.parse(list4[0].split(" ")[0]);
+  int e4 = int.parse(list4[0].split(" ")[1]);
+  Graph graph4 = Graph(v4, e4, list4);
+  FindBridges fb4 = new FindBridges(graph4);
+  print("Bridges in g4 : " + fb4.result().toString());
+
+  File content5 = File("tree.txt");
+  List<String> list5 = await content5.readAsLines();
+  //读取到文件的顶点数量以及
+  int v5 = int.parse(list5[0].split(" ")[0]);
+  int e5 = int.parse(list5[0].split(" ")[1]);
+  Graph graph5 = Graph(v5, e5, list5);
+  FindBridges fb_tree = new FindBridges(graph5);
+  print("Bridges in tree : " + fb_tree.result().toString());
+}
diff --git a/dart/29-Brigde-And-Cut-Points/FindCutPoints.dart b/dart/29-Brigde-And-Cut-Points/FindCutPoints.dart
new file mode 100644
index 0000000..f18398d
--- /dev/null
+++ b/dart/29-Brigde-And-Cut-Points/FindCutPoints.dart
@@ -0,0 +1,96 @@
+import 'Graph.dart';
+import 'dart:collection';
+import 'dart:math';
+import 'dart:io';
+
+/**
+ * 查找割点
+ */
+class FindCutPoints {
+  Graph? _G;
+
+  List? _visited;
+
+  List? _ord;
+
+  List? _low;
+
+  int _cnt = 0;
+
+  HashSet<int>? res;
+
+  FindCutPoints(Graph G) {
+    this._G = G;
+    _visited = List.filled(_G!.V()!, false, growable: true);
+
+    res = HashSet();
+    _ord = List.filled(_G!.V()!, 0, growable: true);
+    _low = List.filled(_G!.V()!, 0, growable: true);
+    _cnt = 0;
+
+    for (int v = 0; v < _G!.V()!; v++) if (!_visited![v]) _dfs(v, v);
+  }
+
+  _dfs(int v, int parent) {
+    _visited![v] = true;
+    _ord![v] = _cnt;
+    _low![v] = _ord![v];
+    _cnt++;
+
+    int child = 0;
+
+    for (int w in _G!.adj(v))
+      if (!_visited![w]) {
+        _dfs(w, v);
+        _low![v] = [(_low![v] as int), (_low![w] as int)].reduce(min);
+
+        if (v != parent && _low![w] >= _ord![v]) res!.add(v);
+
+        child++;
+        if (v == parent && child > 1) res!.add(v);
+      } else if (w != parent)
+        _low![v] = [(_low![v] as int), (_low![w] as int)].reduce(min);
+  }
+
+  result() {
+    return res;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+  Graph graph = Graph(v, e, list);
+  FindCutPoints fc = new FindCutPoints(graph);
+  print("Cut Points in g : " + fc.result().toString());
+
+  File content2 = File("g2.txt");
+  List<String> list2 = await content2.readAsLines();
+  //读取到文件的顶点数量以及
+  int v2 = int.parse(list2[0].split(" ")[0]);
+  int e2 = int.parse(list2[0].split(" ")[1]);
+  Graph graph2 = Graph(v2, e2, list2);
+  FindCutPoints fc2 = new FindCutPoints(graph2);
+  print("Cut Points in g2 : " + fc2.result().toString());
+
+  File content3 = File("g3.txt");
+  List<String> list3 = await content3.readAsLines();
+  //读取到文件的顶点数量以及
+  int v3 = int.parse(list3[0].split(" ")[0]);
+  int e3 = int.parse(list3[0].split(" ")[1]);
+  Graph graph3 = Graph(v3, e3, list3);
+  FindCutPoints fc3 = new FindCutPoints(graph3);
+  print("Cut Points in g3 : " + fc3.result().toString());
+
+  File content5 = File("tree.txt");
+  List<String> list5 = await content5.readAsLines();
+  //读取到文件的顶点数量以及
+  int v5 = int.parse(list5[0].split(" ")[0]);
+  int e5 = int.parse(list5[0].split(" ")[1]);
+  Graph graph5 = Graph(v5, e5, list5);
+  FindCutPoints fc4 = new FindCutPoints(graph5);
+  print("Cut Points in tree : " + fc4.result().toString());
+}
diff --git a/dart/29-Brigde-And-Cut-Points/Graph.dart b/dart/29-Brigde-And-Cut-Points/Graph.dart
new file mode 100644
index 0000000..0d44faa
--- /dev/null
+++ b/dart/29-Brigde-And-Cut-Points/Graph.dart
@@ -0,0 +1,80 @@
+import 'dart:collection';
+import 'dart:io';
+
+/**
+ * 图
+ */
+class Graph{
+  int? _V; //图的顶点数量
+  int? _E; //图的边的数量
+  List? _treeSet;
+
+  Graph(V, E, List list) {
+    _V = V;
+    _E = E;
+    if (V < 0) throw Exception("V must be non-negative");
+    if (E < 0) throw Exception("E must be non-negative");
+    _treeSet = List.generate(V, (_) => SplayTreeSet<int>(), growable: false);
+
+    for (int i = 1; i <= E; i++) {
+      int a = int.parse(list[i].split(" ")[0]);
+      validateVertex(a);
+      int b = int.parse(list[i].split(" ")[1]);
+      validateVertex(b);
+      (_treeSet![a] as SplayTreeSet).add(b);
+      (_treeSet![b] as SplayTreeSet).add(a);
+    }
+  }
+
+  validateVertex(int v) {
+    if (v < 0 || v >= _V!) throw new Exception("vertex  $v is invalid");
+  }
+
+  int? V() {
+    return _V;
+  }
+
+  bool hasEdge(int v, int w) {
+    validateVertex(v);
+    validateVertex(w);
+    return (_treeSet![v] as SplayTreeSet).contains(w);
+  }
+
+  int _degree(int v) {
+    return _treeSet![v].length;
+  }
+
+  int? E() {
+    return _E;
+  }
+
+  adj(int v) {
+    validateVertex(v);
+    return _treeSet![v];
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("V = $_V, E = $_E\n");
+    for (int j = 0; j < _V!; j++) {
+      sb.write("节点：$j ");
+      sb.write("${_treeSet![j].toString()} ");
+    sb.write('\n');
+    }
+    return sb.toString();
+  }
+}
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]) ;
+  int e = int.parse(list[0].split(" ")[1]) ;
+//
+  Graph adjList= Graph(v, e, list);
+  print(adjList);
+
+}
diff --git a/dart/29-Brigde-And-Cut-Points/g.txt b/dart/29-Brigde-And-Cut-Points/g.txt
new file mode 100644
index 0000000..dbfa369
--- /dev/null
+++ b/dart/29-Brigde-And-Cut-Points/g.txt
@@ -0,0 +1,9 @@
+7 8
+0 1
+0 2
+1 3
+2 3
+3 5
+4 5
+4 6
+5 6
\ No newline at end of file
diff --git a/dart/29-Brigde-And-Cut-Points/g2.txt b/dart/29-Brigde-And-Cut-Points/g2.txt
new file mode 100644
index 0000000..5f44c9f
--- /dev/null
+++ b/dart/29-Brigde-And-Cut-Points/g2.txt
@@ -0,0 +1,17 @@
+12 16
+0 1
+0 2
+1 3
+2 3
+3 5
+4 5
+4 6
+4 7
+5 6
+6 8
+8 9
+8 10
+8 11
+9 10
+9 11
+10 11
\ No newline at end of file
diff --git a/dart/29-Brigde-And-Cut-Points/g3.txt b/dart/29-Brigde-And-Cut-Points/g3.txt
new file mode 100644
index 0000000..cb28a27
--- /dev/null
+++ b/dart/29-Brigde-And-Cut-Points/g3.txt
@@ -0,0 +1,6 @@
+4 5
+0 1
+0 2
+1 2
+1 3
+2 3
\ No newline at end of file
diff --git a/dart/29-Brigde-And-Cut-Points/g4.txt b/dart/29-Brigde-And-Cut-Points/g4.txt
new file mode 100644
index 0000000..044f884
--- /dev/null
+++ b/dart/29-Brigde-And-Cut-Points/g4.txt
@@ -0,0 +1,9 @@
+7 8
+0 1
+0 2
+1 3
+1 4
+2 3
+2 6
+3 5
+5 6
\ No newline at end of file
diff --git a/dart/29-Brigde-And-Cut-Points/tree.txt b/dart/29-Brigde-And-Cut-Points/tree.txt
new file mode 100644
index 0000000..dd25f18
--- /dev/null
+++ b/dart/29-Brigde-And-Cut-Points/tree.txt
@@ -0,0 +1,7 @@
+7 6
+0 1
+0 3
+1 6
+2 3
+2 5
+3 4
\ No newline at end of file
diff --git a/dart/30-Minimum-Tree-Spanning/CC.dart b/dart/30-Minimum-Tree-Spanning/CC.dart
new file mode 100644
index 0000000..add8633
--- /dev/null
+++ b/dart/30-Minimum-Tree-Spanning/CC.dart
@@ -0,0 +1,85 @@
+import 'Graph.dart';
+import 'dart:io';
+import 'dart:collection';
+import 'WeightedGraph.dart';
+/**
+ * 图的联通分量BFS
+ */
+class CC {
+  WeightedGraph? _G;
+
+  List? _visited;
+
+  int _cccount = 0;
+
+  CC(WeightedGraph G) {
+    this._G = G;
+    _visited = List.filled(G.V()!, 0, growable: true);
+
+    for (int i = 0; i < _visited!.length; i++) _visited![i] = -1;
+
+    for (int v = 0; v < G.V()!; v++) {
+      if (_visited![v] == -1) {
+        _bfs(v, _cccount);
+        _cccount++;
+      }
+    }
+  }
+
+  _bfs(int v, int ccid) {
+    ListQueue queue = ListQueue();
+    queue.add(v);
+    _visited![v] = ccid;
+    while (!queue.isEmpty) {
+      int v = queue.removeFirst();
+
+      for (int w in _G!.adj(v)) {
+        if (_visited![w] == -1) {
+          queue.add(w);
+          _visited![w] = ccid;
+        }
+      }
+    }
+  }
+
+  int count() {
+    return _cccount;
+  }
+
+  bool isConnected(int v, int w) {
+    _G!.validateVertex(v);
+    _G!.validateVertex(w);
+    return _visited![v] == _visited![w];
+  }
+
+  components() {
+    List? res = List.generate(_cccount, (_) => List.generate(0, (_) => 0),
+        growable: true);
+    for (int v = 0; v < _G!.V()!; v++) res[_visited![v]].add(v);
+    return res;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+//
+  WeightedGraph adjList = WeightedGraph(v, e, list);
+  CC cc = new CC(adjList);
+  print(cc.count());
+
+  print(cc.isConnected(0, 6));
+  print(cc.isConnected(5, 6));
+
+  List comp = cc.components();
+  for (int ccid = 0; ccid < comp.length; ccid++) {
+    print("$ccid  :: ");
+    for (int w in comp[ccid]) {
+      print("$w ");
+    }
+    print("");
+  }
+}
diff --git a/dart/30-Minimum-Tree-Spanning/Edge.dart b/dart/30-Minimum-Tree-Spanning/Edge.dart
new file mode 100644
index 0000000..3bee4ab
--- /dev/null
+++ b/dart/30-Minimum-Tree-Spanning/Edge.dart
@@ -0,0 +1,12 @@
+class Edge {
+  int? v, w;
+  Edge(int v, int w){
+    this.v = v;
+    this.w = w;
+  }
+
+  @override
+  String toString(){
+    return ("$v-$w");
+  }
+}
\ No newline at end of file
diff --git a/dart/30-Minimum-Tree-Spanning/Graph.dart b/dart/30-Minimum-Tree-Spanning/Graph.dart
new file mode 100644
index 0000000..0d44faa
--- /dev/null
+++ b/dart/30-Minimum-Tree-Spanning/Graph.dart
@@ -0,0 +1,80 @@
+import 'dart:collection';
+import 'dart:io';
+
+/**
+ * 图
+ */
+class Graph{
+  int? _V; //图的顶点数量
+  int? _E; //图的边的数量
+  List? _treeSet;
+
+  Graph(V, E, List list) {
+    _V = V;
+    _E = E;
+    if (V < 0) throw Exception("V must be non-negative");
+    if (E < 0) throw Exception("E must be non-negative");
+    _treeSet = List.generate(V, (_) => SplayTreeSet<int>(), growable: false);
+
+    for (int i = 1; i <= E; i++) {
+      int a = int.parse(list[i].split(" ")[0]);
+      validateVertex(a);
+      int b = int.parse(list[i].split(" ")[1]);
+      validateVertex(b);
+      (_treeSet![a] as SplayTreeSet).add(b);
+      (_treeSet![b] as SplayTreeSet).add(a);
+    }
+  }
+
+  validateVertex(int v) {
+    if (v < 0 || v >= _V!) throw new Exception("vertex  $v is invalid");
+  }
+
+  int? V() {
+    return _V;
+  }
+
+  bool hasEdge(int v, int w) {
+    validateVertex(v);
+    validateVertex(w);
+    return (_treeSet![v] as SplayTreeSet).contains(w);
+  }
+
+  int _degree(int v) {
+    return _treeSet![v].length;
+  }
+
+  int? E() {
+    return _E;
+  }
+
+  adj(int v) {
+    validateVertex(v);
+    return _treeSet![v];
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("V = $_V, E = $_E\n");
+    for (int j = 0; j < _V!; j++) {
+      sb.write("节点：$j ");
+      sb.write("${_treeSet![j].toString()} ");
+    sb.write('\n');
+    }
+    return sb.toString();
+  }
+}
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  print(list[0].split(" ")[0]);
+  print(list[0].split(" ")[1]);
+  int v = int.parse(list[0].split(" ")[0]) ;
+  int e = int.parse(list[0].split(" ")[1]) ;
+//
+  Graph adjList= Graph(v, e, list);
+  print(adjList);
+
+}
diff --git a/dart/30-Minimum-Tree-Spanning/Kruskal.dart b/dart/30-Minimum-Tree-Spanning/Kruskal.dart
new file mode 100644
index 0000000..c48955a
--- /dev/null
+++ b/dart/30-Minimum-Tree-Spanning/Kruskal.dart
@@ -0,0 +1,50 @@
+import 'WeightedGraph.dart';
+import 'WeightedEdge.dart';
+import 'CC.dart';
+import 'UF.dart';
+import 'dart:io';
+class Kruskal {
+  WeightedGraph? _G;
+
+  List? mst;
+
+  Kruskal(WeightedGraph G) {
+    this._G = G;
+    mst = List.filled(0, WeightedEdge, growable: true);
+
+    CC cc = new CC(G);
+    if (cc.count() > 1) return;
+
+    List? edges = List.filled(0, WeightedEdge, growable: true);
+    for (int v = 0; v < _G!.V()!; v++)
+      for (int w in G.adj(v))
+        if (v < w) edges.add(new WeightedEdge(v, w, G.getWeight(v, w)));
+
+    edges.sort();
+
+    UF uf = new UF(G.V()!);
+    for (WeightedEdge edge in edges) {
+      int v = edge.getV();
+      int w = edge.getW();
+      if (!uf.isConnected(v, w)) {
+        mst!.add(edge);
+        uf.unionElements(v, w);
+      }
+    }
+  }
+
+  result() {
+    return mst;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+  WeightedGraph g = new WeightedGraph(v,e,list);
+  Kruskal kruskal = new Kruskal(g);
+  print(kruskal.result());
+}
diff --git a/dart/30-Minimum-Tree-Spanning/Prim.dart b/dart/30-Minimum-Tree-Spanning/Prim.dart
new file mode 100644
index 0000000..dbdba26
--- /dev/null
+++ b/dart/30-Minimum-Tree-Spanning/Prim.dart
@@ -0,0 +1,62 @@
+import 'WeightedGraph.dart';
+import 'WeightedEdge.dart';
+import 'CC.dart';
+import 'dart:collection';
+import 'dart:io';
+
+/**
+ * Prim算法中
+ * 需要使用到优先级队列
+ * 而dart中无优先级队列
+ */
+class Prim {
+  WeightedGraph? G;
+
+  List? mst;
+
+  Prim(WeightedGraph G) {
+    this.G = G;
+    mst = List.filled(0, WeightedEdge, growable: true);
+
+    CC cc = new CC(G);
+    if (cc.count() > 1) return;
+
+    List? _visited = List.filled(G.V()!, false, growable: true);
+    _visited[0] = true;
+    Queue pq = ListQueue();
+
+    for (int w in G.adj(0)) {
+      pq.add(new WeightedEdge(0, w, G.getWeight(0, w)));
+    }
+
+    while (!pq.isEmpty) {
+      WeightedEdge minEdge = pq.removeFirst();
+      if (_visited[minEdge.getV()] && _visited[minEdge.getW()]){
+        continue;
+      }
+      print("${minEdge.getV()}  ${minEdge.getW()} ${minEdge.getWeight()}");
+      mst!.add(minEdge);
+
+      int newv = _visited[minEdge.getV()] ? minEdge.getW() : minEdge.getV();
+      _visited[newv] = true;
+      for (int w in G.adj(newv))
+        if (!_visited[w])
+          pq.add(new WeightedEdge(newv, w, G.getWeight(newv, w)));
+    }
+  }
+
+  result() {
+    return mst;
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+  WeightedGraph g = new WeightedGraph(v, e, list);
+  Prim prim = new Prim(g);
+  print(prim.result());
+}
diff --git a/dart/30-Minimum-Tree-Spanning/UF.dart b/dart/30-Minimum-Tree-Spanning/UF.dart
new file mode 100644
index 0000000..ce40e64
--- /dev/null
+++ b/dart/30-Minimum-Tree-Spanning/UF.dart
@@ -0,0 +1,32 @@
+class UF{
+
+ List? parent;
+
+  UF(int n){
+    parent = List.filled(n,0, growable: true);
+    for(int i = 0 ; i < n ; i ++) {
+      parent![i] = i;
+    }
+  }
+
+  int find(int p){
+    if( p != parent![p] )
+      parent![p] = find( parent![p] );
+    return parent![p];
+  }
+
+   bool isConnected(int p , int q){
+    return find(p) == find(q);
+  }
+
+   unionElements(int p, int q){
+
+    int pRoot = find(p);
+    int qRoot = find(q);
+
+    if( pRoot == qRoot )
+      return;
+
+    parent![pRoot] = qRoot;
+  }
+}
\ No newline at end of file
diff --git a/dart/30-Minimum-Tree-Spanning/WeightedEdge.dart b/dart/30-Minimum-Tree-Spanning/WeightedEdge.dart
new file mode 100644
index 0000000..06c02c5
--- /dev/null
+++ b/dart/30-Minimum-Tree-Spanning/WeightedEdge.dart
@@ -0,0 +1,31 @@
+class WeightedEdge implements Comparable {
+  int _v = 0;
+  int _w = 0;
+  int _weight = 0;
+
+  WeightedEdge(this._v, this._w, this._weight);
+
+  @override
+  int compareTo(other) {
+    // TODO: implement compareTo
+    return (_weight - other.getWeight()) as int;
+  }
+
+  int getV() {
+    return _v;
+  }
+
+  int getW() {
+    return _w;
+  }
+
+  int getWeight() {
+    return _weight;
+  }
+
+  @override
+  String toString() {
+    // TODO: implement toString
+    return ("($_v-$_w: $_weight)");
+  }
+}
diff --git a/dart/30-Minimum-Tree-Spanning/WeightedGraph.dart b/dart/30-Minimum-Tree-Spanning/WeightedGraph.dart
new file mode 100644
index 0000000..117a656
--- /dev/null
+++ b/dart/30-Minimum-Tree-Spanning/WeightedGraph.dart
@@ -0,0 +1,101 @@
+import 'dart:collection';
+import 'dart:io';
+
+/**
+ * 无向有权图
+ */
+class WeightedGraph {
+  int? _V;
+
+  int? _E;
+
+  List? _adj;
+
+  WeightedGraph(V, E, List list) {
+    this._V = V;
+    this._E = E;
+
+    _adj = List.generate(_V!, (_) => SplayTreeMap<int, int>(), growable: false);
+
+    for (int i = 1; i <= E; i++) {
+      int a = int.parse(list[i].split(" ")[0]);
+      validateVertex(a);
+      int b = int.parse(list[i].split(" ")[1]);
+      validateVertex(b);
+      int weight = int.parse(list[i].split(" ")[2]);
+
+      if (a == b) throw new Exception("Self Loop is Detected!");
+      if (_adj![a].containsKey(b)) {
+        throw new Exception("Parallel Edges are Detected!");
+      }
+      _adj![a].putIfAbsent(b, () => weight);
+      _adj![b].putIfAbsent(a, () => weight);
+    }
+  }
+
+  validateVertex(int v) {
+    if (v < 0 || v >= (_V as int)) throw new Exception("vertex $v is invalid");
+  }
+
+  int? V() {
+    return _V;
+  }
+
+  int? E() {
+    return _E;
+  }
+
+  bool hasEdge(int v, int w) {
+    validateVertex(v);
+    validateVertex(w);
+    return _adj![v].containsKey(w);
+  }
+
+  adj(int v) {
+    validateVertex(v);
+    return (_adj![v] as SplayTreeMap).keys;
+  }
+
+  int getWeight(int v, int w) {
+    if (hasEdge(v, w)) return _adj![v][w];
+    throw new Exception("No edge $v-$w");
+  }
+
+  int degree(int v) {
+    validateVertex(v);
+    return _adj![v].size();
+  }
+
+  removeEdge(int v, int w) {
+    validateVertex(v);
+    validateVertex(w);
+    if (_adj![v].containsKey(w)) {
+      _E = _E! - 1;
+    }
+    ;
+    _adj![v].remove(w);
+    _adj![w].remove(v);
+  }
+  @override
+  String toString(){
+    StringBuffer sb = new StringBuffer();
+
+    sb.write("V = $_V, E = $E\n");
+    for(int v = 0; v < (_V as int); v ++){
+      sb.write("$v : ");
+      (_adj![v] as SplayTreeMap).entries.forEach((element) { sb.write("( ${element.key}:${element.value} )");});
+      sb.write('\n');
+    }
+    return sb.toString();
+  }
+}
+
+void main() async {
+  File content = File("g.txt");
+  List<String> list = await content.readAsLines();
+  //读取到文件的顶点数量以及
+  int v = int.parse(list[0].split(" ")[0]);
+  int e = int.parse(list[0].split(" ")[1]);
+  WeightedGraph g = new WeightedGraph(v, e, list);
+  print(g);
+}
diff --git a/dart/30-Minimum-Tree-Spanning/g.txt b/dart/30-Minimum-Tree-Spanning/g.txt
new file mode 100644
index 0000000..0b72a71
--- /dev/null
+++ b/dart/30-Minimum-Tree-Spanning/g.txt
@@ -0,0 +1,13 @@
+7 12
+0 1 2
+0 3 7
+0 5 2
+1 2 1
+1 3 4
+1 4 3
+1 5 5
+2 4 4
+2 5 4
+3 4 1
+3 6 5
+4 6 7
\ No newline at end of file
diff --git a/Dart-Basic.iml b/dart/Dart-Basic.iml
similarity index 100%
rename from Dart-Basic.iml
rename to dart/Dart-Basic.iml
diff --git a/python/BST.py b/python/BST.py
new file mode 100644
index 0000000..59ec54b
--- /dev/null
+++ b/python/BST.py
@@ -0,0 +1,106 @@
+class BSTNode(object):
+    def __init__(self, key, value, left=None, right=None):
+        self.key, self.value, self.left, self.right = key, value, left, right
+
+
+class BST(object):
+    def __init__(self, root=None):
+        self.root = root
+
+    @classmethod
+    def build_from(cls, node_list):
+        cls.size = 0
+        key_to_node_dict = {}
+        for node_dict in node_list:
+            key = node_dict['key']
+            key_to_node_dict[key] = BSTNode(key, value=key) 
+
+        for node_dict in node_list:
+            key = node_dict['key']
+            node = key_to_node_dict[key]
+            if node_dict['is_root']:
+                root = node
+            node.left = key_to_node_dict.get(node_dict['left'])
+            node.right = key_to_node_dict.get(node_dict['right'])
+            cls.size += 1
+        return cls(root)
+
+    def _bst_search(self, subtree, key):
+        if subtree is None:  
+            return None
+        elif key < subtree.key:
+            return self._bst_search(subtree.left, key)
+        elif key > subtree.key:
+            return self._bst_search(subtree.right, key)
+        else:
+            return subtree
+
+    def __contains__(self, key):
+        return self._bst_search(self.root, key) is not None
+
+    def get(self, key, default=None):
+        node = self._bst_search(self.root, key)
+        if node is None:
+            return default
+        else:
+            return node.value
+
+    def _bst_min_node(self, subtree):
+        if subtree is None:
+            return None
+        elif subtree.left is None:  
+            return subtree
+        else:
+            return self._bst_min_node(subtree.left)
+
+    def bst_min(self):
+        node = self._bst_min_node(self.root)
+        return node.value if node else None
+
+    def _bst_insert(self, subtree, key, value):
+        
+        if subtree is None:   
+            subtree = BSTNode(key, value)
+        elif key < subtree.key:
+            subtree.left = self._bst_insert(subtree.left, key, value)
+        elif key > subtree.key:
+            subtree.right = self._bst_insert(subtree.right, key, value)
+        return subtree
+
+    def add(self, key, value):
+        node = self._bst_search(self.root, key)
+        if node is not None:  
+            node.value = value
+            return False
+        else:
+            self.root = self._bst_insert(self.root, key, value)
+            self.size += 1
+            return True
+
+    def _bst_remove(self, subtree, key):
+        if subtree is None:
+            return None
+        elif key < subtree.key:
+            subtree.left = self._bst_remove(subtree.left, key)
+            return subtree
+        elif key > subtree.key:
+            subtree.right = self._bst_remove(subtree.right, key)
+            return subtree
+        else:  # 找到了需要删除的节点
+            if subtree.left is None and subtree.right is None:    # 叶节点，返回 None 把其父亲指向它的指针置为 None
+                return None
+            elif subtree.left is None or subtree.right is None:  # 只有一个孩子
+                if subtree.left is not None:
+                    return subtree.left   # 返回它的孩子并让它的父亲指过去
+                else:
+                    return subtree.right
+            else:  # 俩孩子，寻找后继节点替换，并删除其右子树的后继节点，同时更新其右子树
+                successor_node = self._bst_min_node(subtree.right)
+                subtree.key, subtree.value = successor_node.key, successor_node.value
+                subtree.right = self._bst_remove(subtree.right, successor_node.key)
+                return subtree
+
+    def remove(self, key):
+        assert key in self
+        self.size -= 1
+        return self._bst_remove(self.root, key)
\ No newline at end of file
diff --git a/python/__pycache__/sort.cpython-37.pyc b/python/__pycache__/sort.cpython-37.pyc
new file mode 100644
index 0000000..cfe1736
Binary files /dev/null and b/python/__pycache__/sort.cpython-37.pyc differ
diff --git a/python/linkedlist.py b/python/linkedlist.py
new file mode 100644
index 0000000..e7c87fa
--- /dev/null
+++ b/python/linkedlist.py
@@ -0,0 +1,97 @@
+class Node(object):
+    
+    def __init__(self,value):
+        self.value = value;
+        self.next = None;
+    
+    def __str__(self):
+        return self.value;
+
+'''
+    链表
+'''
+class LinkedList(object):
+
+    def __init__(self):
+        self.head = None
+        self.size = 0
+        
+    def getSize(self):
+        return self.size
+    
+    def isEmpty(self):
+        return self.size == 0;
+    
+    #头部添加元素
+    def add(self, value):
+        node = Node(value)
+        node.next = self.head
+        self.head = node
+        self.size +=1
+
+    # 尾部添加元素
+    def append(self, value):
+        node = Node(value)
+        if self.isEmpty():
+            self.head = node
+        else:
+            cur = self.head
+            while cur.next != None:
+                cur = cur.next
+            cur.next = node
+        self.size +=1
+    
+    # 指定位置添加元素
+    def insert(self, pos, value):
+        if pos <= 0:
+            self.add(value)
+        elif pos > self.size:
+            self.append(value)
+        else:
+            node = Node(value)
+            count = 0
+            pre = self.head
+            while count < (pos-1):
+                count += 1
+                pre = pre.next
+            node.next = pre.next
+            pre.next = node
+            self.size +=1 
+    
+    # 删除节点
+    def remove(self,value):
+        cur = self.head
+        pre = None
+        isFind = False
+        while cur != None:
+            if cur.value == value:
+                if not pre:
+                    self.head = cur.next
+                else:
+                    pre.next = cur.next
+                self.size -=1
+                isFind = True
+                break
+            else:
+                pre = cur
+                cur = cur.next
+        return isFind
+
+    # 查找节点是否存在     
+    def search(self,value):
+        cur = self.head
+        while cur != None:
+            if cur.value == value:
+                return True
+            cur = cur.next
+        return False
+
+        
+
+
+
+
+
+
+
+
diff --git a/python/loopqueue.py b/python/loopqueue.py
new file mode 100644
index 0000000..bb4f152
--- /dev/null
+++ b/python/loopqueue.py
@@ -0,0 +1,65 @@
+'''
+    循环队列
+'''
+class LoopQueue(object):
+
+    def __init__(self, n=10):
+        self.arr = [None] * (n)  
+        self.front = 0
+        self.tail = 0
+        self.size = 0
+
+    def getCapacity(self):
+        capacity = len(self.arr) - 1;
+        return capacity;
+
+    def dequeue(self):
+        if self.isEmpty() :
+            raise Exception("Cannot dequeue from an empty queue")
+        ret = self.arr[self.front]
+        self.arr[self.front] = None
+        self.front = (self.front + 1)%len(self.arr)
+        self.size -=1
+        if((self.size == self.getCapacity()//4)) and (self.getCapacity()/2 !=0):
+            resize(self.getCapacity()//2)
+        return ret
+
+    def resize(self,newCapacity):
+        newArr = [None]*(newCapacity+1)
+        for i in range(0,len(self.arr)):
+            newArr[i] = self.arr[(i+self.front)%len(self.arr)];
+        self.arr = newArr
+        self.front = 0;
+        self.tail = self.size;
+    
+    def enqueue(self,element):
+        print('当前大小:',self.size)
+        if ((self.tail+1)%len(self.arr)) == self.front:
+            self.resize(self.getCapacity()*2)
+        self.arr[self.tail] = element
+        self.tail = (self.tail +1)% len(self.arr)
+        self.size += 1
+        print('当前大小:',self.size)
+
+    def getFront(self):
+        if(self.isEmpty()):
+            raise Exception("Queue is empty.")        
+        return self.arr[self.front]
+
+    def getSize(self):
+        return len(self.arr)
+    
+    def isEmpty(self):
+        return self.front == self.tail
+        
+    def __str__(self):
+        return "front ["+" ".join(map(str, self.arr)) + "] tail"
+
+if __name__ == '__main__':
+    loopQueue = LoopQueue();
+    for i in range(0,30):
+        loopQueue.enqueue(i);
+        print(loopQueue)
+
+      
+      
\ No newline at end of file
diff --git a/python/multiSort.py b/python/multiSort.py
new file mode 100644
index 0000000..09f9eca
--- /dev/null
+++ b/python/multiSort.py
@@ -0,0 +1,176 @@
+'''
+    线性查找
+    冒泡排序
+    选择排序
+    插入排序
+    希尔排序
+    快速排序
+    归并排序
+    二分搜索
+'''
+import random
+import time
+# 线性查找算法
+def liner_search(list,value):
+    for item in range(len(list)):
+        if(list[item] == value):
+            return item;
+    return -1;    
+print("---------------------线性查找");
+testList = [1,2,3,4,5,6,7,8,9]
+start = time.perf_counter()
+print(liner_search(testList, 8))
+end = time.perf_counter()
+print("时间：", end-start)
+
+# 选择排序
+def selectionSort(sortList):
+  for i in range(len(sortList)):
+      minIndex = i ;
+      for j in range(i,len(sortList)):
+          if sortList[minIndex]>sortList[j]:
+              minIndex=j
+      sortList[i],sortList[minIndex] = sortList[minIndex],sortList[i]
+  return sortList
+
+
+ # 冒泡排序
+def bubble_sort(sortList):
+      for i in range(len(sortList)):
+          isSwap = False; #设置标志位，若已排序好，则不排序
+          for j in range(len(sortList)-i-1):
+              if sortList[j] > sortList[j + 1]:
+                    sortList[j], sortList[j + 1] = sortList[j + 1], sortList[j]
+                    isSwap = True
+          if not isSwap:
+            break
+
+# 插入排序
+def insertionSort(sortList):
+    for i in range(1,len(sortList)):
+        currentValue = sortList[i]
+        currentPosition = i 
+        while currentPosition>0 and sortList[currentPosition-1]>currentValue:
+            sortList[currentPosition] = sortList[currentPosition-1]
+            currentPosition = currentPosition-1
+        sortList[currentPosition] = currentValue
+    return sortList
+
+#希尔排序
+def shellSort(sortList):
+    length = len(sortList)
+    dist = length // 2
+    
+    while dist > 0 :
+        for i in range(dist,length):
+            j = i 
+            while j >= dist and sortList[j-dist] > sortList[j] :
+                sortList[j-dist],sortList[j] = sortList[j],sortList[j-dist]
+                j = j- dist
+        dist = dist//2
+    return sortList
+
+#快速排序
+def quickSort(sortList,left,right):
+    if left<right:
+        q = partition(sortList,left,right)
+        quickSort(sortList,left,q-1)
+        quickSort(sortList, q+1, right)
+
+def partition(sortList,left,right):
+    i = left-1
+    pivot  = sortList[right]
+    for j in range(left,right):
+        if sortList[j] <= pivot:
+            i +=1
+            sortList[i],sortList[j] = sortList[j],sortList[i]
+    sortList[i+1],sortList[right] = sortList[right],sortList[i+1]
+    return i +1    
+
+# 归并排序
+def merge(sortList1, sortList2): 
+    result = []
+    while arr1 and arr2:
+        if sortList1[0] < sortList2[0]:
+            result.append(sortList1.pop(0))
+        else:
+            result.append(sortList2.pop(0))
+    if sortList1:
+        result += sortList1
+    if sortList2:
+        result += sortList2
+    return result
+
+def merge_sort(sortList):
+    if len(sortList) <= 1:
+        return arr
+    mid = len(sortList) // 2
+    return merge(merge_sort(sortList[:mid]), merge_sort(sortList[mid:]))
+
+# 二分搜索
+def binarySearch(sortList,left,right,x):
+    if right >= left :
+        mid = int(left + (right-left)/2)
+        if sortList[mid] == x:
+            return mid
+        elif sortList[mid] >x:
+            return binarySearch(sortList, left, mid-1, x) 
+        else:
+            return binarySearch(sortList, mid+1, right, x)
+    else:
+        return -1 
+
+def sumNumber(n):
+    if n == 0:
+        return 0
+    return n+sumNumber(n-1)
+
+# 计算结果，计算时间
+def caculateResultAndTime(name,fuction,randomseed):
+    print("--------------------",name,'\n')
+    random.seed(randomseed)
+    sortList = [random.randint(0,100) for _ in range(30)]
+    print("原始数据：",sortList)
+    startTime = time.perf_counter()
+    fuction(sortList)
+    endTime = time.perf_counter()
+    print("排序结果:",sortList,'\n花费时间：',endTime-startTime)
+    print("-------------------- 结束\n")
+
+if __name__ == '__main__':
+    caculateResultAndTime("希尔排序",shellSort,88)
+    caculateResultAndTime("插入排序",insertionSort,89)
+    caculateResultAndTime("冒泡排序",bubble_sort,90)
+    caculateResultAndTime("选择排序",selectionSort,91)
+    caculateResultAndTime("归并排序",selectionSort,93)
+
+    print("--------------------快速排序")
+    random.seed(92)
+    sortList = [random.randint(0,100) for _ in range(15)]
+    print("原始数据：",sortList)
+    startTime = time.perf_counter()
+    quickSort(sortList, 0, len(sortList)-1)
+    endTime = time.perf_counter()
+    print("排序结果:",sortList,' 花费时间：',endTime-startTime)
+    print("-------------------- 结束\n")
+
+    print("--------------------二分搜索")
+    sortList = list(range(15))
+    print("原始数据：",sortList)
+    startTime = time.perf_counter()
+    result = binarySearch(sortList, 0, len(sortList)-1,10)
+    endTime = time.perf_counter()
+    print("查找结果:",result,' 花费时间：',endTime-startTime)
+    print("-------------------- 结束\n")
+    
+    print("--------------------递归函数")
+    print('递归结果：',sumNumber(100))
+    print("-------------------- 结束\n")
+
+
+    
+        
+    
+
+
+
diff --git a/python/queue.py b/python/queue.py
new file mode 100644
index 0000000..f150f99
--- /dev/null
+++ b/python/queue.py
@@ -0,0 +1,44 @@
+'''
+    队列
+'''
+class Queue(object):
+
+    # 初始化 
+    def __init__(self):
+        self.__list = []
+
+    #添加元素
+    def push(self,element):
+        self.__list.append(element)
+
+    # 弹出元素
+    def pop(self):
+       if self.isEmpty():
+           return None
+       else:
+           return self.__list.pop(0)
+
+    #是否为空
+    def isEmpty(self):
+        return len(self.__list) == 0
+    
+    def getSize(self):
+        return len(self.__list)
+    
+    def __str__(self):
+       return " ".join(map(str, self.__list))
+
+if __name__ == '__main__':
+    testQueue = Queue();
+    testQueue.push(1)
+    testQueue.push(2)
+    testQueue.push(3)
+    testQueue.push(4)
+    print(testQueue)  
+    testQueue.pop()
+    print(testQueue)  
+
+
+    
+        
+
diff --git a/python/stack.py b/python/stack.py
new file mode 100644
index 0000000..c3937ae
--- /dev/null
+++ b/python/stack.py
@@ -0,0 +1,44 @@
+'''
+    栈
+'''
+class Stack(object):
+
+    # 初始化 
+    def __init__(self):
+        self.__list = []
+
+    #添加元素
+    def push(self,element):
+        self.__list.append(element)
+
+    # 弹出元素
+    def pop(self):
+       if self.isEmpty():
+           return None
+       else:
+           return self.__list.pop()
+
+    #是否为空
+    def isEmpty(self):
+        return len(self.__list) == 0
+    
+    def getSize(self):
+        return len(self.__list)
+    
+    def __str__(self):
+       return " ".join(map(str, self.__list))
+
+if __name__ == '__main__':
+    testStack = Stack();
+    testStack.push(1)
+    testStack.push(2)
+    testStack.push(3)
+    testStack.push(4)
+    print(testStack)  
+    testStack.pop()
+    print(testStack)  
+
+
+    
+        
+
