• 栈 队列 链表


     栈:先进后出

    /**
     * 栈
     * 
     * @author sun
     *
     */
    public class MyStack {
    	private int maxSize;
    	private char[] data;
    	private int top;
    
    	public MyStack(int maxSize) {
    		this.maxSize = maxSize;
    		this.data = new char[maxSize];
    		this.top = -1;
    	}
    
    	public void push(char c) {
    		data[++top] = c;
    	}
    
    	public char pop() {
    		return data[top--];
    	}
    
    	public boolean isEmpty() {
    		return top == -1;
    	}
    }
    

      队列:先进先出

    public class Queue {
    	// 数组
    	private long[] arr;
    	
    	// 最大空间
    	private int maxSize;
    	
    	// 有效元素大小
    	private int elems;
    	
    	// 队头
    	private int font;
    	
    	// 队尾
    	private int end;
    	
    	public Queue(int maxSize) {
    		this.maxSize = maxSize;
    		arr = new long[maxSize];
    		elems = 0;
    		font = 0;
    		end = -1;
    	}
    	
    	// 插入数据
    	public void insert(long value) {
    		if(end == maxSize - 1) {
    			end = -1;
    		}
    		arr[++end] = value;
    		elems++;
    	}
    	
    	// 移除数据
    	public long remove() {
    		long tmp = arr[font++];
    		
    		if(font == maxSize) {
    			font = 0;
    		}
    		elems--;
    		return tmp; 
    	}
    	
    	// 是否为空
    	public boolean isEmpty() {
    		return (elems == 0);
    	}
    	
    	// 是否满了
    	public boolean isFull() {
    		return (elems == maxSize);
    	}
    	
    	// 返回有效元素大小
    	public int size() {
    		return elems;
    	}
    }
    

      循环队列:当我们一直使用对头front,对尾end进行添加,删除元素时,会发现数组很容易满,这时,我们将对头front,对尾end再指向初始化位置。

    public class MyQueue {
        // 数组
        private long[] arr;
        
        // 最大空间
        private int maxSize;
        
        // 有效元素大小
        private int elems;
        
        // 队头
        private int font;
        
        // 队尾
        private int end;
        
        public MyQueue(int maxSize) {
            this.maxSize = maxSize;
            arr = new long[maxSize];
            elems = 0;
            font = 0;
            end = -1;
        }
        
        // 插入数据
        public void insert(long value) {
            if(end == maxSize - 1) {
                end = -1;
            }
            arr[++end] = value;
            elems++;
        }
        
        // 移除数据
        public long remove() {
            long tmp = arr[font++];
            
            if(font == maxSize) {
                font = 0;
            }
            elems--;
            return tmp; 
        }
        
        // 是否为空
        public boolean isEmpty() {
            return (elems == 0);
        }
        
        // 是否满了
        public boolean isFull() {
            return (elems == maxSize);
        }
        
        // 返回有效元素大小
        public int size() {
            return elems;
        }
    }

    优先级队列

    public class PriorityQueue {
        // 数组
        private long[] arr;
        
        // 最大空间
        private int maxSize;
        
        // 有效元素大小
        private int elems;
        
        
        public PriorityQueue(int maxSize) {
            this.maxSize = maxSize;
            arr = new long[maxSize];
            elems = 0;
        }
        
        // 插入数据
        public void insert(long value) {
            int i;
            for (i = 0;  i < elems; i++) {
                if(value < arr[i]) {
                    break;
                }
            }
            
            for(int j = elems; j > i;j--){
                arr[j] = arr[j - 1];
            }
            arr[i] = value;
            elems++;
        }
        
        // 移除数据
        public long remove() {
            long value = arr[elems - 1];
            elems--;
            return value;
        }
        
        // 是否为空
        public boolean isEmpty() {
            return (elems == 0);
        }
        
        // 是否满了
        public boolean isFull() {
            return (elems == maxSize);
        }
        
        // 返回有效元素大小
        public int size() {
            return elems;
        }
    }

    链表

    /**
     * 链结点
     * 
     * @author sun
     *
     */
    public class Link {
    	private Long data;
    	private Link next;
    
    	public Link(Long data) {
    		this.data = data;
    	}
    
    	public Long getData() {
    		return data;
    	}
    
    	public void setData(Long data) {
    		this.data = data;
    	}
    
    	public Link getNext() {
    		return next;
    	}
    
    	public void setNext(Link next) {
    		this.next = next;
    	}
    
    }
    

      

    public class LinkList {
        private Link first;
    
        public LinkList() {
            first = null;
        }
    
        public void insert(long value) {
            Link lnk = new Link(value);
            if (first == null)// 是否只有一个链结点
            {
                first = lnk;
            } else {
                lnk.setNext(first);
                first = lnk;
            }
        }
    
        public void displayList() {
            Link current = first;
            while (current != null) {
                System.out.print(current.getData() + " ");
                current = current.getNext();
            }
        }
    
        /**
         * 关键字找链结点
         * 
         * @param key
         * @return
         */
        public Link find(long key) {
            Link current = first;
            while (current.getData() != key) {
                if (current.getNext() == null) {
                    return null;
                } else {
                    current = current.getNext();
                }
            }
            return current;
        }
    
        /**
         * 插入结点到指定位置
         * 
         * @param value
         * @param pos
         */
        public void insert(long value, int pos) {
            if (pos == 0) {
                insert(value);
            } else {
                Link current = first;
                for (int i = 0; i < pos - 1; i++) {
                    current = current.getNext();
                }
                Link lnk = new Link(value);
                lnk.setNext(current.getNext());
                current.setNext(lnk);
            }
        }
    
        /**
         * 删除首结点
         * 
         * @return 该结点值
         */
        public long deleteFirst() {
            Link temp = first;
            first = first.getNext();
            return temp.getData();
        }
    
        /**
         * 删除结点
         * 
         * @param key
         */
        public void delete(long key) {
            Link current = first;
            Link previous = first;
            while (current.getData() != key) {
                if (current.getNext() == null) {
                    return;
                } else {
                    previous = current;
                    current = current.getNext();
                }
            }
            if (current == first) {
                first = first.getNext();
            } else {
                previous.setNext(current.getNext());
            }
        }
    
        /**
         * 链表是否为空
         * 
         * @return
         */
        public boolean isEmpty() {
            return (first == null);
        }
    
    }
  • 相关阅读:
    如何提取Redis中的大KEY
    VIM标记 mark 详解
    JAVA编写的一个简单的Socket实现的HTTP响应服务器
    onenote 直接发布文章到CSDN
    guava学习笔记--字符串处理
    带打印子结点的自底向上算法
    动态规划算法3
    动态规划算法2
    一个菜鸟学习动态规划算法的过程
    php取得当前时间函数
  • 原文地址:https://www.cnblogs.com/sunTin/p/6718473.html
Copyright © 2020-2023  润新知