java 算法单链表 栈树图

    xiaoxiao2021-03-26  17

     

    package package1;

    public interface LList<T> {   /**      * 判断线性表是否空      * @return      */     boolean isEmpty();         /**      * 返回线性表长度      * @return      */     int length();         /**      * 返回第i(i≥0)个元素      * @param i      * @return      */     T get(int i);         /**      * 设置第i个元素值为x      * @param i      * @param x      */     void set(int i, T x);         /**      * 插入x作为第i个元素      * @param i      * @param x      */     void insert(int i, T x);         /**      * 在线性表最后插入x元素      * @param x      */     void append(T x);         /**      * 删除第i个元素并返回被删除对象      * @param i      * @return      */     T remove(int i);         /**      * 删除线性表所有元素      */     void removeAll();         /**      * 查找,返回首次出现的关键字为key元素      * @param key      * @return      */     T search(T key); }

    -------------------------------------------------

     

    package package1;

    public class Node<T> {   /**      * 数据域,保存数据元素      */     public T data;         /**      * 地址域,引用后继结点      */     public Node<T> next;

        /**      * 构造结点,data指定数据元素,next指定后继结点      *      * @param data      * @param next      */     public Node(T data, Node<T> next) {         this.data = data;         this.next = next;     }

        /**      * 构造节点      */     public Node() {         this(null, null);     }

        /**      * 返回结点元素值对应的字符串      */     @Override     public String toString() {         return this.data.toString();     }

        /**      * 比较两个结点值是否相等,覆盖Object类的equals(obj)方法      */     @SuppressWarnings("unchecked")     @Override     public boolean equals(Object obj) {         return obj == this || obj instanceof Node && this.data.equals(((Node<T>)obj).data);     }     }

    --------------------------------------------------------------------

     

    package package1;

    public class SinglyLinkedList<T> implements LList<T> {  /**      * 头指针,指向单链表的头结点      */     public Node<T> head;

        /**      * 默认构造方法,构造空单链表      */     public SinglyLinkedList() {         // 创建头结点,data和next值均为null         this.head = new Node<T>();     }

        /**      * 由指定数组中的多个对象构造单链表。采用尾插入构造单链表      * 若element==null,Java将抛出空对象异常;若element.length==0,构造空链表      *      * @param element      */     public SinglyLinkedList(T[] element) {         // 创建空单链表,只有头结点         this();         // rear指向单链表最后一个结点         Node<T> rear = this.head;         for (int i = 0; i < element.length; i++) {             rear.next = new Node<T>(element[i], null);             rear = rear.next;         }     }

        /**      * 判断单链表是否空,O(1)      */     @Override     public boolean isEmpty() {         return this.head.next == null;     }

        /**      * 返回单链表长度,O(n), 基于单链表遍历算法      */     @Override     public int length() {         int i = 0;         // p从单链表第一个结点开始         Node<T> p = this.head.next;         // 若单链表未结束         while (p != null) {             i++;             // p到达后继结点             p = p.next;         }         return i;     }

        /**      * 返回第i(≥0)个元素,若i<0或大于表长则返回null,O(n)      */     @Override     public T get(int i) {         if (i >= 0) {             Node<T> p = this.head.next;             for (int j = 0; p != null && j < i; j++) {                 p = p.next;             }

                // p指向第i个结点             if (p != null) {                 return p.data;             }         }         return null;     }

        /**      * 设置第i(≥0)个元素值为x。若i<0或大于表长则抛出序号越界异常;若x==null,不操作。O(n)      */     @Override     public void set(int i, T x) {         if (x == null)             return;

            Node<T> p = this.head.next;         for (int j = 0; p != null && j < i; j++) {             p = p.next;         }

            if (i >= 0 && p != null) {             p.data = x;         } else {             throw new IndexOutOfBoundsException(i + "");         }     }

        /**      * 插入第i(≥0)个元素值为x。若x==null,不插入。 若i<0,插入x作为第0个元素;若i大于表长,插入x作为最后一个元素。O(n)      */     @Override     public void insert(int i, T x) {         // 不能插入空对象         if (x == null) {             return;         }

            // p指向头结点         Node<T> p = this.head;         // 寻找插入位置         for (int j = 0; p.next != null && j < i; j++) {             // 循环停止时,p指向第i-1结点或最后一个结点             p = p.next;         }         // 插入x作为p结点的后继结点,包括头插入(i<=0)、中间/尾插入(i>0)         p.next = new Node<T>(x, p.next);     }

        /**      * 在单链表最后添加x对象,O(n)      */     @Override     public void append(T x) {         insert(Integer.MAX_VALUE, x);     }

        /**      * 删除第i(≥0)个元素,返回被删除对象。若i<0或i大于表长,不删除,返回null。O(n)      */     @Override     public T remove(int i) {         if (i >= 0) {             Node<T> p = this.head;             for (int j = 0; p.next != null && j < i; j++) {                 p = p.next;             }

                if (p != null) {                 // 获得原对象                 T old = p.next.data;                 // 删除p的后继结点                 p.next = p.next.next;                 return old;             }         }         return null;     }

        /**      * 删除单链表所有元素 Java将自动收回各结点所占用的内存空间      */     @Override     public void removeAll() {         this.head.next = null;     }

        /**      * 顺序查找关键字为key元素,返回首次出现的元素,若查找不成功返回null      * key可以只包含关键字数据项,由T类的equals()方法提供比较对象相等的依据      */     @Override     public T search(T key) {         if (key == null)             return null;         for (Node<T> p = this.head.next; p != null; p = p.next)             if (p.data.equals(key))                 return p.data;         return null;     }

        /**      * 返回单链表所有元素的描述字符串,形式为“(,)”,覆盖Object类的toString()方法,O(n)      */     @Override     public String toString() {         String str = "(";         for (Node<T> p = this.head.next; p != null; p = p.next) {             str += p.data.toString();             if (p.next != null)                 str += ","; // 不是最后一个结点时后加分隔符         }         return str + ")"; // 空表返回()     }

        /**      * 比较两条单链表是否相等      */     @SuppressWarnings("unchecked")     @Override     public boolean equals(Object obj) {         if (obj == this)             return true;

            if (obj instanceof SinglyLinkedList) {             SinglyLinkedList<T> list = (SinglyLinkedList<T>) obj;             return equals(this.head.next, list.head.next);         }         return false;     }

        /**      * 比较两条单链表是否相等,递归方法      *      * @param p      * @param q      * @return      */     private boolean equals(Node<T> p, Node<T> q) {         return p == null && q == null || p != null && q != null                 && p.data.equals(q.data) && equals(p.next, q.next);     } }

    ----------------------------------------------------------

    package package1;

    // 文档的分割与合并,  基于大文档 public class test {

     public static void main(String[] args) {    SinglyLinkedList<String> lista = new SinglyLinkedList<String>();          for (int i = 0; i <= 5; i++)              lista.insert(i, new String((char) ('A' + i) + ""));                   System.out.println("本案例中链表的初始位置是0,即 元素是从第0个位置开始数的\n ");                   System.out.println("数组lista的所有元素值依次插入到单链表中,数据分别是:\n " + lista.toString());

                      System.out.println("单链表的长度是length()="+ lista.length());                   System.out.println("返回第0个链表节点值lista.get(0):"+ lista.get(0) );                   System.out.println("返回最后一个链表节点值lista.get(5):"+ lista.get(5) );                                                   lista.set(0, new String((char) (lista.get(0).charAt(0) + 32) + ""));          System.out.println("修改 链表的第0个数据值 数据后,新的链表元素值分别是:\n" + lista.toString());

                      String x="x";    lista.insert(2, x);          System.out.println("单链表第二个位置插入x后,数据分别是:\n"+ lista.toString() );

                      lista.remove(6);          System.out.println("单链表 删除 第6个位置数据后,数据分别是:\n"+ lista.toString() );                           System.out.println("search链表元素值是:\n" + lista.search("x"));    }

    }

     

     

    ==============================================

    顺序栈

    package package1;

    public class SeqStack {  private static final int MAXSIZE = 100;  private int top;  private String[] data;

     SeqStack()  {   Init_SeqStack(MAXSIZE);  }

     private void Init_SeqStack(int size)  {   data = new String[size];   top = -1;  }

     public int Empty_SeqStack()  {   if (top == -1)    return 1;   else    return 0;  }

     public int Full_SeqStack()  {   if (top == MAXSIZE - 1)    return 1;   else    return 0;  }

     public int Push_SeqStack(String x)  {   if (Full_SeqStack() == 1)    return 0;   else   {    top++;    data[top] = x;    return 1;   }  }

     public String Pop_SeqStack()  {   if (Empty_SeqStack() == 1)    return null;   else    return data[top--];  }

     public String Top_SeqStack()  {   if (Empty_SeqStack() == 1)    return null;   else    return data[top];  }

    }

     

     

     

     

     

     

     

     

    ===========下列转载的文章,谢谢合作!知识共享!

    http://blog.csdn.net/yaoweijq/article/details/7183937  Java中栈的最大递归深度http://blog.chinaunix.net/uid-20384806-id-1954176.html 递归的本质:使用 栈 来实现,

     

     http://blog.csdn.net/jiutianhe/article/details/18605999

    ===========

     

    二叉树        

     

     

     

     

    递归  全排列:

    123    213   231  321  312  132  

     

      

     

    ===========

     

    二叉树     

     

    案例一:   

    package com.cxl.algorithm;

    // 二叉树接口的ADT public interface IBiTree {

    }

     

    ---------------------------

    package com.cxl.algorithm;

    // 二叉树的 链式  结点 的结构 public class LinkBiTNode {  public int data;  public LinkBiTNode lchild;  public LinkBiTNode rchild;

     public void LinkBiTNode(LinkBiTNode lchildval, LinkBiTNode rchildval)  {   lchild = lchildval;   rchild = rchildval;  }

     public LinkBiTNode(int elem, LinkBiTNode lchildval, LinkBiTNode rchildval)  {   data = elem;   LinkBiTNode(lchildval,rchildval);  }

        }

    ---------------------------------

    package com.cxl.algorithm;

    public class LinkBiTree implements IBiTree {  private LinkBiTNode root; // 用于指示二叉树的根节点

     public LinkBiTNode getRoot()  {   return root;  }

     public void setRoot(LinkBiTNode root)  {   this.root = root;  }

     public void insert(int value)  {   LinkBiTNode newNode = new LinkBiTNode(value, null, null);

      if (root == null)   {    root = newNode;   } else   {    LinkBiTNode currentNode = root;    LinkBiTNode parentNode;    while (true)    {     parentNode = currentNode;     // 往右放     if (newNode.data > currentNode.data)     {      currentNode = currentNode.rchild;      if (currentNode == null)      {       parentNode.rchild = newNode;       return;      }     } else     {      // 往左放      currentNode = currentNode.lchild;      if (currentNode == null)      {       parentNode.lchild = newNode;       return;      }

        }    }

      }  }

     LinkBiTree()  {   root = null;  } } /*  * public LinkBiTree initiate() { // 初始建立一颗带有头节点的二叉树;  *  * LinkBiTNode bt = new LinkBiTNode(null, null);  *  * LinkBiTree T = new LinkBiTree();  *  * T.root = bt;  *  * return T; }  *  * public LinkBiTree create(String x, LinkBiTree lbt, LinkBiTree rbt) { //  * 初始建立一颗以X为根节点的二叉树; LinkBiTree T = new LinkBiTree(); LinkBiTNode bt = new  * LinkBiTNode(x, null, null);  *  * T.root = bt; // T.bt.lchild = lbt; // T.bt.rchild = rbt; return T; }  *  * public LinkBiTree createBiTree(String x, LinkBiTree lbt, LinkBiTree rbt) { //  * 初始建立一颗以X为根节点的二叉树; LinkBiTNode temp = null ; if(root == null) { temp = new  * LinkBiTNode(x,null,null); root = temp ; } else { while(temp) { if( x <  * root.data ) temp = root.lchild ; root = temp ; else temp = root.rchild ; root  * = temp }  *  * }  *  *  *  * LinkBiTree T = new LinkBiTree(); LinkBiTNode bt = new LinkBiTNode(x, null,  * null);  *  * T.root = bt; // T.bt.lchild = lbt; // T.bt.rchild = rbt; return T; }  *  * }  */

    --------------------------------

    package com.cxl.algorithm; public class test {

      public static void main(String[] args) {       LinkBiTree tree = new LinkBiTree();    tree.insert(10);     tree.insert(40);     tree.insert(20);     tree.insert(3);     tree.insert(49);     tree.insert(13);     tree.insert(123);                 System.out.println("root=" + tree.getRoot().data);

                System.out.println("================================ ");

     

     

    ===========

     

     上述案例代码更新:

    package package1;

    //二叉树的 链式  结点 的结构 public class LinkBiTNode {

    public int data; public LinkBiTNode lchild; public LinkBiTNode rchild;

    public void LinkBiTNode(LinkBiTNode lchildval, LinkBiTNode rchildval) { lchild = lchildval; rchild = rchildval; }

    public LinkBiTNode(int elem, LinkBiTNode lchildval, LinkBiTNode rchildval) { data = elem; LinkBiTNode(lchildval,rchildval); }

     

    }

     

    ------------------------

     

    package package1;

    public class LinkBiTree implements IBiTree {  //LinkBiTNode p = null;

     private LinkBiTNode root; // 用于指示二叉树的根节点

     public LinkBiTNode getRoot()  {   return root;  }

     public void setRoot(LinkBiTNode root)  {   this.root = root;  }

     public void insertLTree(int value)  {   LinkBiTNode newNode = new LinkBiTNode(value, null, null);   if (root == null)    root = newNode;   else   {       LinkBiTNode parentNode = root;    while (parentNode.lchild != null)//找到左叶子结点    {          parentNode = parentNode.lchild;        }    parentNode.lchild = newNode;   }

     }

     public LinkBiTNode search(LinkBiTNode bt ,int x ) //返回指定元素值得对象内存空间  {      LinkBiTNode p = null;   if( bt != null)   {    if( bt.data == x ) return bt ;    if(bt.lchild != null) p = search(bt.lchild, x);    if(p != null ) return p;        if(bt.rchild != null) p = search(bt.rchild, x);    if(p != null) return p;   }         return null;  }      public int countLeaf( LinkBiTNode bt )//统计二叉树的叶子结点个数  {   if(bt == null) return 0 ;        if(bt.lchild ==null && bt.rchild ==null) return 1;   return ( countLeaf(bt.lchild)+countLeaf(bt.rchild));  }        public void insert(int value)  {   LinkBiTNode newNode = new LinkBiTNode(value, null, null);

      if (root == null)   {    root = newNode;   } else   {    LinkBiTNode currentNode = root;    LinkBiTNode parentNode;    while (true)    {     parentNode = currentNode;     // 往右放     if (newNode.data > currentNode.data)     {      currentNode = currentNode.rchild;      if (currentNode == null)      {       parentNode.rchild = newNode;       return;      }     } else     {      // 往左放      currentNode = currentNode.lchild;      if (currentNode == null)      {       parentNode.lchild = newNode;       return;      }

        }    }

      }  }

     LinkBiTree()  {   root = null;  }

     public void PreOrder(LinkBiTNode bt)  {   if (bt == null)    return;   System.out.print(bt.data + "-");   PreOrder(bt.lchild);   PreOrder(bt.rchild);  }

    }

    --------------------------------------

     

    package package1;

    // 文档的分割与合并,  基于大文档 public class test {

     public static void main(String[] args) {      LinkBiTree tree = new LinkBiTree();       tree.insert(10);       tree.insert(40);       tree.insert(20);       tree.insert(3);       tree.insert(49);       tree.insert(13);       tree.insert(123);       tree.insertLTree(55);                     System.out.println("root=" + tree.getRoot().data);

                    System.out.println("================================ ");            tree.PreOrder(tree.getRoot() );            System.out.println(tree.search(tree.getRoot(), 13));            System.out.println("叶子结点个数是:"+tree.countLeaf(tree.getRoot()));

     }

    }

    ========================================================

    package queue;

    //自己定义的 队列

    public class MyQueue {

       private int [] data;//存储元素的  数组空间  private int num;//用于存储队列的元素   当前总的个数  private int front ; // 对头  private int end ; // 对尾    public MyQueue(){     data = new int[10];     num =0;     front =0;     end =-1;    }

      /**     * 带参数的构造方法     */    public MyQueue(int maxsize){     data = new int[maxsize];     num =0;     front =0;     end =-1;    }

       // 添加队列元素    public void insert(int value){

        data[++end] = value;     num++;    }          public long remove(){

       num--;     return data[front++];        }          //查看数据    public long peek(){    return  data[front];    }

       //判断是否为空    public boolean isEmpty(){     return num == 0 ;    }          public boolean isFull(){     return num == data.length ;    }          }

    ------------------------------------------------------------

    package queue;

    public class TestMyQueue {

     public static void main(String[] args)  {   MyQueue myQueue = new MyQueue();        myQueue.insert(100);   myQueue.insert(200);   myQueue.insert(300);   myQueue.insert(400);   myQueue.insert(500);      System.out.println("队列的头元素是:"+myQueue.peek());   System.out.print("队列中的每一个元素是:");   while (!myQueue.isEmpty()) {    System.out.print( myQueue.remove() + "  ");       }   System.out.println();

     }

    }

     

     

    队列的头元素是:100 队列中的每一个元素是:100  200  300  400  500  ==============================================================================

     

     

    package queue;

    //自己定义的  改进后 的   循环  队列

    public class MyQueue {

     private int MAXSIZE = 5;  private int[] data;// 存储元素的 数组空间  private int num;// 用于存储队列的元素 当前总的个数  private int front; // 对头  private int end; // 对尾

     public MyQueue()  {   data = new int[MAXSIZE];   num = 0;   front = 0;   end = -1;   System.out.println(     "默认队列的信息是:队列的总容量是: " + MAXSIZE + ";\n已经存储的元素个数是: " + num + " ; \n队首指针是:" + front + ";\n队尾指针是:" + end);  }

     /**   * 带参数的构造方法   */  public MyQueue(int maxsize)  {   MAXSIZE = maxsize;   data = new int[maxsize];   num = 0;   front = 0;   end = -1;   System.out.println("自己制定的队列的信息是:队列的总容量是: " + MAXSIZE + ";\n已经存储的元素个数是: " + num + " ; \n队首指针是:" + front     + ";\n队尾指针是:" + end);

     }

     // 添加队列元素  public void insert(int value)  {

      //if (end == data.length - 1)   //{   // end = -1;   //}   if (num == MAXSIZE)   {    System.out.println("队列已满,无法再插入新元素了!");   } else   {    end = (end + 1) % MAXSIZE;    data[end] = value;    num++;    System.out.println("你往队列中插入了一个新元素:" + value + " ;队列存储的元素个数 是:"+num +" ;front is "+ front +" ; end is :"+ end);

      }  }

     public long remove()  {

      if (num == 0)   {    System.out.print("队列  已空 ,无法再 删除 元素了! 返回的 0 代表的是 空元素---");    return 0;   } else   {    num--;    long i = data[front];

       front = (front + 1) % MAXSIZE;    System.out.println("你从队列中 删除了队首 头元素:" + i + " ;队列存储的元素个数 是:"+num +" ;front is "+ front +" ; end is :"+ end +";");    return i;   }

     }

     // 查看数据  public long peek()  {   System.out.print("队列首元素front指针是:"+front+" ;你 现在 从队列中  查看  队首 头元素:");   return data[front];  }

     // 判断是否为空  public boolean isEmpty()  {  // System.out.print("当前队列 包含的元素  是 空的 。");   return num == 0;  }

     public boolean isFull()  {   System.out.print("当前队列 包含的元素  是 满的 。");   return num == data.length;  }

    }

    ------------------------------------------------

     

    package queue;

    public class TestMyQueue {

     public static void main(String[] args)  {   MyQueue myQueue = new MyQueue();        myQueue.insert(100);   myQueue.insert(200);   myQueue.insert(300);   myQueue.insert(400);   myQueue.insert(500);   myQueue.insert(1500);      System.out.println("队列的头元素是:"+myQueue.peek());

      myQueue.remove();   myQueue.remove();   myQueue.remove();   myQueue.insert(1500);   myQueue.insert(1500);      System.out.println("队列中的每一个元素是:");   while (!myQueue.isEmpty()) {    System.out.print( myQueue.remove() + "  ");       }   System.out.println();      myQueue.remove();        }

    }

    -----------------------------------------

     

    默认队列的信息是:队列的总容量是: 5; 已经存储的元素个数是: 0 ; 队首指针是:0; 队尾指针是:-1 你往队列中插入了一个新元素:100 ;队列存储的元素个数 是:1 ;front is 0 ; end is :0 你往队列中插入了一个新元素:200 ;队列存储的元素个数 是:2 ;front is 0 ; end is :1 你往队列中插入了一个新元素:300 ;队列存储的元素个数 是:3 ;front is 0 ; end is :2 你往队列中插入了一个新元素:400 ;队列存储的元素个数 是:4 ;front is 0 ; end is :3 你往队列中插入了一个新元素:500 ;队列存储的元素个数 是:5 ;front is 0 ; end is :4 队列已满,无法再插入新元素了! 队列首元素front指针是:0 ;你 现在 从队列中  查看  队首 头元素:队列的头元素是:100 你从队列中 删除了队首 头元素:100 ;队列存储的元素个数 是:4 ;front is 1 ; end is :4; 你从队列中 删除了队首 头元素:200 ;队列存储的元素个数 是:3 ;front is 2 ; end is :4; 你从队列中 删除了队首 头元素:300 ;队列存储的元素个数 是:2 ;front is 3 ; end is :4; 你往队列中插入了一个新元素:1500 ;队列存储的元素个数 是:3 ;front is 3 ; end is :0 你往队列中插入了一个新元素:1500 ;队列存储的元素个数 是:4 ;front is 3 ; end is :1 队列中的每一个元素是: 你从队列中 删除了队首 头元素:400 ;队列存储的元素个数 是:3 ;front is 4 ; end is :1; 400  你从队列中 删除了队首 头元素:500 ;队列存储的元素个数 是:2 ;front is 0 ; end is :1; 500  你从队列中 删除了队首 头元素:1500 ;队列存储的元素个数 是:1 ;front is 1 ; end is :1; 1500  你从队列中 删除了队首 头元素:1500 ;队列存储的元素个数 是:0 ;front is 2 ; end is :1; 1500  队列  已空 ,无法再 删除 元素了! 返回的 0 代表的是 空元素---

     

    ====================

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-659738.html

    最新回复(0)