zoukankan      html  css  js  c++  java
  • 数据结构复习之【队列】

    队列是先进先出的线性表;

    队列由于是线性表,因此也有顺序存储和链式存储两种实现方式;


    一、顺序存储实现


    由于队列的特性是:从队尾添加,从对头删除,因此如果让数组的尾部用作队尾,数组的头部用作队头,则删除元素时,时间复杂度为O(n);

    因此我们需要用循环数组实现,并且维护两个属性 front、rear,front用来记录队头的位置,rear记录队尾的下一个位置;比如:


    这样能够充分利用数组的空间,但是预先规定了空间就不能再改变;

    代码实现如下:

    package org.xiazdong.list;
    
    public class MyArrayQueue<T> {
    	private int front;
    	private int rear;
    	private int length;
    	private T[] t;
    	public MyArrayQueue(){
    		front = rear = length = 0;
    		t = (T[])new Object[20];
    	}
    	public void append(T e) throws Exception{
    		if(length==t.length){
    			throw new QueueOverFlowException();
    		}
    		length++;
    		t[rear] = e;
    		rear = (rear+1)%t.length;
    	}
    	public T remove() throws Exception{
    		if(length<=0){
    			throw new QueueOffFlowException();
    		}
    		T e = t[front];
    		length--;
    		front = (front + 1)%t.length;
    		return e;
    	}
    	public int getSize(){
    		return length;
    	}
    }
    class QueueOverFlowException extends Exception{
    	public QueueOverFlowException(){
    		super();
    	}
    
    	@Override
    	public String getMessage() {
    		return "队列溢出";
    	}
    	
    }
    class QueueOffFlowException extends Exception{
    	public QueueOffFlowException(){
    		super();
    	}
    
    	@Override
    	public String getMessage() {
    		return "队列空";
    	}
    	
    }

    二、链式存储实现

    链式存储简单的说就是单链表+front、rear指针;

    front指向头结点,rear指向最后一个节点;

    回顾一下头结点的定义:不具有任何意义的节点,为了操作单链表方便而使用;


    代码实现如下:

    package org.xiazdong.list;
    
    
    public class MyListQueue<T> {
    	private BeginNode front;
    	private Node rear;
    
    	public MyListQueue(){
    		front = new BeginNode(0,null);	
    		rear = front;
    	}
    	public void append(T e){
    		Node n = new Node(e,null);
    		rear.next = n;
    		rear = n;
    		front.elem++;
    	}
    	public T remove() throws Exception{
    		if(front.elem<=0){
    			throw new Exception();
    		}
    		T e = front.next.elem;
    		front.next = front.next.next;
    		front.elem--;
    		if(front.elem==0){
    			rear = front;
    		}
    		return e;
    	}
    	class Node {
    		private T elem;
    		Node next;
    
    		public Node() {
    			elem = null;
    			next = null;
    		}
    
    		public Node(T elem, Node next) {
    			this.elem = elem;
    			this.next = next;
    		}
    
    	}
    
    	class BeginNode extends Node {
    		int elem;
    
    		public BeginNode(int elem, Node next) {
    			this.elem = elem;
    			this.next = next;
    		}
    	}
    }
    

    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    嵌入式软件开发环境搭建与工具推荐
    软件常用设计原则与实践:契约式接口设计、安全编码实践
    服务器崩掉 ,只剩下挂载文件,重现github docker 容器
    基础巩固篇 —— CountDownLatch的理解
    基础巩固篇 —— 对锁的理解
    基础巩固篇 —— 对不安全集合的理解
    基础巩固篇 —— 对CAS的理解
    基础巩固篇 —— 对volatile关键字的理解
    响应式布局
    jQuery Mobile 网格
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058061.html
Copyright © 2011-2022 走看看