在数据结构中,我们比较熟悉的有:数组,链表,树,栈,队列。那么就这几种基本的数据结构来说,也是存在一些应用上的区别的。

  • 数组,链表,树:这几种是最基本的数据结构,常常用来实际存储数据。

  • 栈,队列这两种数据结构一般是用作程序员实现算法时的工具,在java中有一些jdk提供的类,是对相应接口的实现,比较抽象,且有访问受限的特性。

1.栈

    栈一般基于数组或者链表来制作,数组和链表是栈中实际存储数据所使用的数据结构。它最基本的特性是“先进后出,后进先出”,不满足这条规则的数据结构不是栈。

    在java中jdk里已经有一些实现的栈,或者具有栈的功能的更强大的类型。那么为了解栈的特性,我们基于数组DIY一个简单的栈。

    思路:栈一般有一个栈顶指针top,指向栈顶元素的位置。实际存储数据的结构我们使用数组。另外栈应该具有一些基本的操作,push(入栈),pop(出栈),peek(查看栈顶元素),isEmpty(栈是否空),isFull(栈是否满)。

    下面是java代码:

  //将域都设为私有,只能通过公有的方法访问,以满足栈的访问受限特性
  
  public class Stack{
     private int[] elements; //栈中存储的元素是int型的,用int型数组来存储
     private int top;        //栈顶指针,指向栈顶
     private int MAXSIZE = 20;    // 用于存储数据的数组长度,也是栈的最大容量
      
     public Stack(){
      this.elements = new int[MAXSIZE];
      top = -1; 
      }
    
    //入栈
     public void push(int index) {
       stackElements[++top] = index;
      }
   //出栈
     public int pop() {
      return stackElements[top--];
      }

    //查看栈顶元素	
     public int peek() {
      return stackElements[top];
     }

     
     // 查看栈是否为空
      public boolean isEmpty() {
       if (top == -1) {
       return true;//为空
       } else {
	return false;
	}
     }
  
  }

    那么这就是一个最简单的栈。刚才我们提到java中已经有一些内置的类,如LinkedList等等,这些类型从其提供的方法来看,既可以是栈也可以是队列或者其他的数据结构。那么如果我们的算法希望用到一个严格的栈。我们可以自己diy一个栈,像上面的程序那样。同时,我们也可以自己写一个类来封装那些高级的类。将其设为我们自定义类中的private域,然后封装一些他的满足栈特性的公有方法作为接口暴露出来,供其他类访问即可。

2.队列

   队列一般来说具有先进先出特性。那么队列一般也是基于数组和链表来实现的,也就是说其底层用来实际存储数据的数据结构也是数组或者链表。

   那么,一般来说,队列有基础队列,循环队列,双端队列,优先级队列。后两种队列就不再具有先进先出的特性了。但是其也是基础队列的变种。

   双端队列,简单来说就是两边都可以remove的队列。

   优先级队列呢,就是说数据在队列中是有一个特定的顺序的,所有插入时,要先排序,再从指定位置插入,所以不再是只能从rear队尾插入。其他的和基础队列都是类似的。

   下面我们diy一个简单的循环队列。

//一个循环队列,先进先出,基于数组实现、
//
public class Queue {
    private int MAXSIZE;//队列的最大长度
    private long[] elements;
    private int front;//指向队首位置
    private int rear;//指向队尾位置
    private int nums;//队列中实际元素的个数,可用于判断队列空满状态
	
	public Queue(int MAXSIZE) {
		this.MAXSIZE = MAXSIZE;
	    elements = new long[MAXSIZE];
		this.front = 0;
		this.rear = -1;
        this.nums = 0;
	}

	public void add(long ele){
		if(rear==(MAXSIZE-1)){
			rear = -1;
		}
		elements[++rear] = ele;
	    nums++;
	}

     
    public long remove(){
    	long temp = elements[front++];
		if(front==MAXSIZE){
			front = 0;
		}
		nums--;
		return temp;
    }
    
    public long peek(){
    	return elements[front];
    }
    
    public boolean isEmpty(){
    	if(nums==0){
    		return true;
    	}else
    		return false;
    	
    }
    
    public boolean isFull(){
    	if(nums==MAXSIZE){
    		return true;
    	}else{
    		return false;
    	}
    	
    }

}

    那么以上就是队列和栈的简单理解了。