• java实现顺序表、链表、栈 (x)->{持续更新}


    1.java实现节点

    /**
     * 节点
     * @luminous-xin
     * @param <T>
     */
    public class Node<T> {
        T data;
        Node<T> next;
        public Node(Node<T> n){
            next = n;
        }
        public Node(T obj,Node<T> n){
            data = obj;
            next = n;
        }
        public T getData(){
            return data;
        }
        public Node<T> getNext(){
            return next;
        }
    }

    2.java实现链表

    /**
     * 链表
     * @author luminous-xin
     * @param <T>
     */
    public class ListLink<T> {
        //头指针
        private Node<T> head;
        //单链表的长度
        private int length;
    
        //构造一个空的链表
        public ListLink() {
            length = 0;
            head = new Node<T>(null);
        }
    
        //获取链表头节点的位置
        public Node<T> getHead() {
            return head;
        }
    
        //在链表中插入一个元素
        public boolean add(T obj, int pos) {
            if (pos < 1 || pos > length + 1) {
                System.out.println("pos值不合法");
                return false;
            }
            int num = 1;
            Node<T> p = head, q = head.next;
            while (num < pos) {
                p = q;
                q = q.next;
                num++;
            }
            p.next = new Node<T>(obj, q);
            length++;
            return true;
    
        }
    
        //删除链表中某各元素
        public T remove(int pos) {
            if (isEnpty()) {
                System.out.println("链表为空表");
                return null;
            }
            if (pos < 1 || pos > length + 1) {
                System.out.println("pos值不合法");
                return null;
            }
            int num = 1;
            Node<T> p = head, q = head.next;
            while (num < pos) {
                p = q;
                q = q.next;
                num++;
            }
            p.next = q.next;
            length--;
            return q.data;
        }
    
        //获取链表中一个元素的值
        public T value(int pos) {
            if (isEnpty()) {
                System.out.println("链表为空表");
                return null;
            }
            if (pos < 1 || pos > length + 1) {
                System.out.println("pos值不合法");
                return null;
            }
            int num = 1;
            Node<T> p = head, q = head.next;
            while (num < pos) {
                p = q;
                q = q.next;
                num++;
            }
            return q.data;
        }
    
        //在链表中查找一个元素,返回该元素下标的索引
        public int find(T obj) {
            if (isEnpty()) {
                System.out.println("链表为空表");
                return -1;
            }
            int num = 1;
    
            Node<T> p = head, q = head.next;
            while (q!= null) {
                if (obj.equals(q.data)) {
                    return num;
                }
                p = q;
                q = q.next;
                num++;
            }
            return -1;
           /* Node<T> p = head.next;
            while (p != null) {
                if (p.data.equals(obj) == false) {
                    p = p.next;
                    num++;
                } else break;
    
            }
            if (p == null) {
                return -1;
            }
            return num;*/
        }
    
        //更新链表中某各元素
        public boolean modify(T obj, int pos) {
            if (isEnpty()) {
                System.out.println("链表为空表");
                return false;
            }
            if (pos < 1 || pos > length + 1) {
                System.out.println("pos值不合法");
                return false;
            }
            int num = 1;
            Node<T> q = head.next;
            while (num < pos) {
                q = q.next;
                num++;
            }
            q.data = obj;
            return true;
        }
    
        //判空
        public boolean isEnpty() {
            return length == 0;
        }
    
        //求链表中数据元素的个数
        public int size() {
            return length;
        }
    
        //一次访问链表中每个元素并输出
        public void nextOrder() {
            Node<T> q = head.next;
            while (q != null) {
                System.out.println(q.data);
                q = q.next;
            }
        }
    
        //销毁一个已经存在的链表
        public void clear() {
            length = 0;
            head.next = null;
        }
    
        public static void main(String[] args) {
            ListLink<Integer> l = new ListLink<>();
            int i;
            int a[] = {23, 56, 12, 49, 35};
            for (i = 0; i < a.length; i++) {
                l.add(a[i], i + 1);
            }
            System.out.println("单链表中的数据元素为:");
            l.nextOrder();
            System.out.println(l.find(5));
    
        }

    3.java实现顺序表

    /**
     * 顺序表
     * @author luminous-xin
     * @param <T>
     */
    public class SequenceList<T> {
        final int maxSize = 10;           //顺序表中一维数组的长度
        private T[] listArray;             //存储元素的数组对象
        private int length;                 //保存顺序表的当前长度
        public SequenceList(){                   //构造一个空的线性表
            length = 0;
            listArray = (T[])new Object[maxSize];
        }
        public SequenceList(int n){
            if(n <= 0){
                System.out.println("error");
                System.exit(1);
            }
            length = 0;
            listArray = (T[])new Object[n];
        }
        public boolean add(T obj , int pos){                  //在线性表中插入一个新元素
            if(pos < 1 || pos > length + 1){                //检验插入位置的有效性
                System.out.println("pos不合法");
                return false;
            }
            if(length == listArray.length){                 //扩容
                T[] p = (T[])new Object[length*2];
                for (int i = 0; i < length; i++) {
                    listArray = p;
                }
            }
            for (int i = length; i > pos; i--) {           //插入
                listArray[i] = listArray[i-1];
            }
            listArray[pos-1] = obj;
            length++;
            return true;
        }
        public T remove(int pos){                               //在线性表中删除一个元素
            if(isEmpty()){
                System.out.println("顺序表为空,无法执行删除操作");
                return null;
            }else{
                if(pos<1 || pos >length){
                    System.out.println("pos不合法");
                    return null;
                }
    
                T  x = listArray[pos-1];                          //备份被删除的元素,将其作为返回值返回
                for (int i = pos ; i <= length; i++) {
                    listArray[i-1] = listArray[i];
                }
                length++;
                return x;
            }
        }
    
        public int find(T obj){                      //在线性表中查找一个元素
            if(isEmpty()){
                System.out.println("顺序表为空");
                return -1;
            }else{
                for(int i = 0 ; i <length ; i++){
                    if(listArray[i].equals(obj)){
                        return i + 1;                     //返回该元素的位置
                    }
                }
                return -1;
            }
        }
        public T value(int pos){                                  //获取线性表中的一个元素
            if(isEmpty()){
                System.out.println("顺序表为空");
            }else{
                if(pos < 1 || pos > length +1){
                    System.out.println("pos值不合法");
                }
            }
            return listArray[pos - 1];
        }
        public boolean modify(T obj,int pos){                      //更新线性表中的某各元素
            if(isEmpty()){
                System.out.println("顺序表为空");
                return false;
            }else{
                if(pos < 1 || pos > length  ){
                    System.out.println("pos值不合法");
                    return false;
                }
            }
            listArray[pos-1] = obj;
            return true;
        }
        public boolean isEmpty(){                              //判空
            return length == 0;
        }
        public int size(){                              //求线性表中数据元素的个数
            return length;
        }
        public void nextOrder(){                      //一次访问栈中的每个元素并输出
            for(int i = 0 ; i< length; i++ ){
                System.out.println(listArray[i]);
            }
        }
        public void clear(){                       //销毁一个已经存在的线性表
            length = 0;
        }
    
    
    }

    4.链表的应用,合并两个有序链表

    public class Chap2_2 {
        public static <T extends Comparable> void MergeList_L(ListLink<T> la, ListLink<T> lb ,ListLink<T> lc){
            Node<T> pa,pb,pc;
            pa = la.getHead().next;
            pb = lb.getHead().next;
            pc = lc.getHead();
    
            while(pa != null && pb != null){
                if(pa.data.compareTo(pb.data)<0){
                    pc.next = pa;
                    pc = pa ;
                    pa = pa.next;
                }else{
                    pc.next = pb;
                    pc = pb;
                    pb = pb.next;
                }
    
                while (pa != null){
                    pc.next = pa;
                    pc =  pc.next;
                    pa = pa.next;
                }
                while (pb != null){
                    pc.next = pb;
                    pc = pb;
                    pb = pb.next;
                }
                la.clear();
                lb.clear();
            }
        }
        public static void main(String[] args) {
            int i,j,k = 0;
            int[] b = {12,23,35,49,56};
            int[] a = {10,15,20};
            ListLink<Integer> la = new ListLink<>();
            ListLink<Integer> lb = new ListLink<>();
            ListLink<Integer> lc = new ListLink<>();
            for ( i = 0; i < a.length; i++) {
                la.add(a[i],i+1);
            }
            System.out.println("单链表a中的元素为:");
            la.nextOrder();
            for (j = 0; j < b.length; j++) {
                lb.add(b[j],j+1);
            }
            System.out.println("单链表b中的数据元素为:");
            lb.nextOrder();
            MergeList_L(la,lb,lc);
            System.out.println("单链表c中的元素为:");
            lc.nextOrder();
        }
    }

    5.java实现顺序栈

    /**
     * 顺序栈
     * @author luminous-xin
     * @param <T>
     */
    public class SequenceStack<T> {
        final int maxSize = 10;
        private T[] stackArray;
        private int top;
        //各方法的具体实现后有详细描述
        public SequenceStack(){
            top = -1;
            stackArray = (T[])new Object[maxSize];
        }
        public SequenceStack(int n){
            if(n<=0){
                System.out.println("数组长度要大于零,否则退出程序运行!");
                System.exit(1);
            }
            top = -1;
            stackArray = (T[])new Object[n];
        }
        //在栈顶位置插入一个新元素
        public void push(T obj){
            if(top == stackArray.length-1){
                T[] p = (T[])new Object[top*2+2];
                for (int i = 0; i <= top; i++){
                    p[i] = stackArray[i];
                }
                stackArray = p;
            }
    
            top++;
            stackArray[top] = obj;
        }
        //删除栈顶元素
        public T pop(){
            if(top == -1) {
                System.out.println("数据栈已空,无法删除元素");
                return null;
            }
            top--;
            return stackArray[top+1];
        }
        //取栈顶数据元素
        public T getHead(){
            if (top == -1){
                System.out.println("数据栈已空,无法删除元素");
                return null;
            }
            return stackArray[top];
        }
        //判断当前栈是否为空
        public boolean isEmpty(){
            return top == -1;
        }
        //求出栈中元素的个数
        public int size(){
            return top +1;
        }
        //依次访问栈中元素并输出
        public void nextOrder(){
            for(int i = top ; i >= 0;i--){
                System.out.println(stackArray[i]);
            }
        }
        //销毁一个已经存在的栈
        public void clear(){
            top = -1;
        }
    }

     6.java实现链栈

    /**
     * 链栈
     * @luminous-xin
     * @param <T>
     */
    public class LinkStack<T> {
        private Node<T> top;   //栈顶指针
        private int length;     //存储栈的长度
        public LinkStack(){     //构造一个空的栈
            length = 0;
            top = null;
        }
        public void push(T obj){        //入栈
            top = new Node<T>(obj,top);
            length++;
        }
        public T pop(){                 //出栈
            if(top == null){
                System.out.println("栈已空,无法删除");
                return null;
            }
            T x = top.data;
            top = top.next;
            length--;
            return x;
        }
        public T getHead(){             //取栈顶元素
            if(top == null){
                System.out.println("栈已空,无法删除");
                return null;
            }
            return top.data;
        }
        public int size(){              //求出栈中元素的个数
            return length;
        }
        public boolean isEmpty(){       //判断栈是否为空
            if (top ==null){
                return true;
            }
            return false;
        }
        public void nextOrder(){        //便利栈
            Node<T> p = top;
            while (p != null){
                System.out.println(p.data);
                p = p.next;
            }
        }
    
        public void clear(){            //销毁一个栈
            top = null;
        }
    }

     7.java实现顺序链表

    import org.omg.CORBA.Object;
    
    /**
     * 循环队列
     * @author luminous
     * @param <T>
     */
    public class SequenceQueue<T> {
        final int maxSize = 10;
        private T queueArray[];
        private int front, rear;
    
        public SequenceQueue() {
            rear = front = 0;
            queueArray = (T[]) new Object[maxSize];
        }
    
        public void enQueue(T obj) {                            //入队
            if ((rear + 1) % queueArray.length == front) {
                T[] p = (T[]) new Object[queueArray.length * 2];
                if (rear == ((T[]) queueArray).length) {
                    for (int i = 0; i <= rear; i++) {
                        p[i] = queueArray[i];
                    }
                } else {
                    int i,j = 1;
                    for (i = front + 1; i<queueArray.length;i++,j++)
                        p[j] = queueArray[i];
                    for (i = 0;i<= rear ; i++,j++)
                        p[j] = queueArray[i];
                    front = 0;
                    rear = queueArray.length-1;
                }
                queueArray = p;
            }
            rear = (rear+1)%queueArray.length;
            queueArray[rear] = obj;
        }
        public T DeQueue(){                             //出队
            if(isEmpty()){
                System.out.println("队列已空,无法出队!");
                return null;
            }
            front = (front +1)%queueArray.length;
            return queueArray[front];
    
        }
        public T getTop(){                                  //取出头元素
            if(isEmpty()){
                System.out.println("队列已空,无法读取元素!");
                return null;
            }
            return queueArray[(front+1)%queueArray.length] ;
        }
        public boolean isEmpty(){                   //队列的非空队列
            return front==rear;
        }
        public int size(){                      //求队列长度
            return (rear - front +queueArray.length)%queueArray.length;
        }
        public void nextOrder(){            //遍历队列
            int i,j = front ;
            for (i = 1; i < size(); i++) {
                j = (j+1)%queueArray.length;
                System.out.println(queueArray[j]);
    
            }
        }
        public void clear(){       //清空队列
                front = rear =0;
        }
    }
  • 相关阅读:
    MongoDB--CSharp Driver Quickstart .
    关于 IIS7.0下文件写入无权限的解决办法
    Android和WCF通信
    要想有什么样的成就就要有什么样的眼光
    DateTime.Now.ToString() 用法
    机械硬盘怎么看是否4k对齐
    【.Net】在WinForm中选择本地文件
    【.Net】C#获取Windows系统特殊文件夹的路径
    【Python】Python网络编程
    【Asp.Net Core】在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序
  • 原文地址:https://www.cnblogs.com/luminous-Xin/p/11574999.html
Copyright © 2020-2023  润新知