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
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    KnockoutJS 3.X API 第五章 高级应用(4) 自定义处理逻辑
    KnockoutJS 3.X API 第五章 高级应用(3) 虚拟元素绑定
    KnockoutJS 3.X API 第五章 高级应用(2) 控制后代绑定
    KnockoutJS 3.X API 第五章 高级应用(1) 创建自定义绑定
    KnockoutJS 3.X API 第四章(14) 绑定语法细节
    KnockoutJS 3.X API 第四章(13) template绑定
    KnockoutJS 3.X API 第四章 表单绑定(12) selectedOptions、uniqueName绑定
    KnockoutJS 3.X API 第四章 表单绑定(11) options绑定
    KnockoutJS 3.X API 第四章 表单绑定(10) textInput、hasFocus、checked绑定
    KnockoutJS 3.X API 第四章 表单绑定(9) value绑定
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058061.html
Copyright © 2011-2022 走看看