• 栈、队列、链表


    特性: LIFO

    public class StackApp {
    
    	public static void main(String[] args) {
    		Stack stack = new Stack(10);
    		
    		stack.push(10);
    		stack.push(20);
    		stack.push(40);
    		stack.push(80);
    		stack.push(100);
    		
    		while (!stack.isEmpty()){
    			System.out.println(stack.pop()+" ");
    		}
    	}
    }
    
    class Stack{
    	private int maxSize;
    	private long[] stackArray;
    	private int top;
    	
    	public Stack(int size){
    		stackArray = new long[size];
    		maxSize = size;
    		top = -1;
    	}
    	
    	public void push(long value){
    		stackArray[++top] = value;
    	}
    	
    	public long pop(){
    		return stackArray[top--];
    	}
    	
    	public boolean isEmpty(){
    		return top == -1;
    	}
    	
    	public boolean isFull(){
    		return top == maxSize-1;
    	}
    	
    }


    应用场景:

    1. 程序运行时的栈空间,用来顺序存储局部变量和参数,每当函数被调用时,局部变量和方法参数会被“pushed into” stack,当方法returns,these locals and parameters are "popped".

    2. Expression evaluation and syntax parsing

    参考: http://en.wikipedia.org/wiki/Stack_(abstract_data_type)


    队列

    特点:FIFO

    public class QueueApp {
    
    	public static void main(String[] args) {
    		Queue queue = new Queue(3);
    		queue.insert(43);
    		queue.insert(24);
    		
    		queue.remove();
    		
    		queue.insert(36);
    		queue.insert(48);
    		queue.insert(78);
    	
    		while(!queue.isEmpty()){
    			System.out.println(queue.remove());
    		}
    	}
    }
    
    //循环队列
    class Queue {
    	private int head;
    	private int rear;
    	private long[] queueArray;
    	private int maxSize;
    	private int size;//当前队列size
    	
    	public Queue(int size){
    		queueArray = new long[size];
    		maxSize = size;
    		head = 0;
    		rear = 0;
    		this.size = 0;
    	}
    	
    	public void insert(long value){
    		if (isFull()){
    			System.out.println("Queue is already full");
    			return;
    		}
    		queueArray[rear++] = value;
    		if (rear == maxSize){
    			rear = 0;
    		}
    		size++;
    	}
    	
    	public long remove(){
    		long temp = queueArray[head++];
    		if (head == maxSize){
    			head = 0;
    		}
    		size--;
    		return temp;
    	}
    	
    	
    	public boolean isFull(){
    		return size == maxSize;
    	}
    	
    	public boolean isEmpty(){
    		return size == 0;
    	}
    	
    	public int size(){
    		return size;
    	}
    }

    参考: http://en.wikipedia.org/wiki/Queue_%28abstract_data_type%29


    链表

    特点:插入、删除需要O(1),查询需要O(N)

    基于Java的双向链表:
    public class LinkedListApp {
    
    	public static void main(String[] args) {
    		DoubleLinkedList<String> list = new DoubleLinkedList<String>();
    		list.add("one");
    		list.add("two");
    		list.add("three");
    		
    		list.removeFirst();
    		
    		list.display();
    	}
    
    }
    
    
    class DoubleLinkedList<E>{
    	private int size = 0;
    	private Entry<E> header = new Entry<E>(null, null, null);
    	
    	public DoubleLinkedList(){
    		header.next = header.previous = header;
    	}
    	
    	public void add(E element){
    		addBefore(element, header);
    	}
    	
    	private void addBefore(E element, Entry<E> entry){
    		Entry<E> newEntry = new Entry<E>(element, entry, entry.previous);
    		newEntry.next.previous = newEntry;
    		newEntry.previous.next = newEntry;	
    		size++;
    	}
    	
    	public E removeFirst(){
    		return remove(header.next);
    	}
    	
    	public E removeLast(){
    		return remove(header.previous);
    	}
    	
    	public E remove(Entry<E> e){
    		if (e.next == header) {
    			throw new RuntimeException("List is empty");
    		}
    		
    		e.previous.next = e.next ;
    		e.next.previous = e.previous;
    		
    		e.next = e.previous = null;
    		e.element = null;
    		
    		size--;
    		
    		return e.element;
    	}
    	
    	public void display(){
    		Entry<E> e = header.next;
    		while (e.element != null){
    			System.out.println(e.element);
    			e = e.next;
    		}
    	}
    	
    	private static class Entry<E> {
    		private E element;
    		private Entry<E> next;
    		private Entry<E> previous;
    		
    		private Entry(E element, Entry<E> next, Entry<E> previous){
    			this.element = element;
    			this.next = next;
    			this.previous = previous;
    		}	
    	}	
    }


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    jvM垃圾回收
    Java快速失败和安全失败
    方法覆盖和方法重载
    leetcode-Reverse Words in a String
    自己玩玩
    leetcode-Reverse Vowels of a String
    leetcode-Reverse String
    leetcode-Multiply Strings
    java多线程-cas及atomic
    @media响应式布局
  • 原文地址:https://www.cnblogs.com/significantfrank/p/4875833.html
Copyright © 2020-2023  润新知