zoukankan      html  css  js  c++  java
  • 重新整理数据结构与算法——数组模拟队列和环形队列[三]

    前言

    在开发之中我们基本上不会自己再去写队列了,而是去使用现在成熟的队列框架。

    但是我们也应该知道如何去自己实现。

    整理基本的数据结构,大概81篇,为c# 文。

    正文

    队列的一些特性:

    1.队列是一个有序列表,可以用数组和链表来实现。

    2.遵守先入先出原则。

    那么一个队列需要什么?

    下面几个参数是需要的:

    1.一个数组

    2.队尾标志

    3.队首标志

    4.数组大小

    函数:

    1.判断是否为空

    2.判断是否满了

    3.向队列里添加元素

    4.向队列弹出元素

    5.展示队首元素

    code 实现

    public class ArrayQueue
    {
    	private int[] arr;
    	private int MaxLen;
    	private int front=-1;
    	private int rear=-1;
    
    	public ArrayQueue(int len)
    	{
    		this.MaxLen = len;
    		this.arr = new int[len];
    	}
    
    	//是否队列满了
    	public bool isFull()
    	{
    		return rear == MaxLen - 1;
    	}
    
    	//是否队列为空
    	public bool isEmply()
    	{
    		return rear == front;
    	}
    
    	//添加队列元素
    	public bool addEle(int ele)
    	{
    		if (isFull())
    		{
    			return false;
    		}
    		rear++;
    		arr[rear] = ele;
    		return true;
    	}
    	//显示队列中全部数据
    	public void showQueue()
    	{
    		for (int i=front+1;i<=rear;i++)
    		{
    			Console.WriteLine(arr[i]);
    		}
    	}
    	//将队首弹出
    	public int pop() {
    		if (isEmply())
    		{
    			throw new Exception();
    		}
    		return arr[++front];
    	}
    
    	//显示队首
    	public int headQueue() {
    		if (isEmply())
    		{
    			throw new Exception();
    		}
    		return arr[front+1];
    	}
    }
    

    出现的问题,或者说不足之处:

    这个队列是一次性的,因为front 最终会到达rear,这样就一直显示队列满了。

    那么这个时候就需要环形数组。

    环形数组

    环形数组设置front 和rear 全部为0。

    看下什么时候队列是满的:

    什么时候队列是空的:

    有了这两个就很好改了。

    环形数组代码

    public class CircleQueue
    {
    	private int[] arr;
    	private int MaxLen;
    	private int front;
    	private int rear;
    
    	public CircleQueue(int len)
    	{
    		this.MaxLen = len;
    		this.arr = new int[len];
    	}
    
    	//是否队列满了
    	public bool isFull()
    	{
    		return rear+1%MaxLen== front;
    	}
    
    	//是否队列为空
    	public bool isEmply()
    	{
    		return rear == front;
    	}
    
    	//添加队列元素
    	public bool addEle(int ele)
    	{
    		if (isFull())
    		{
    			return false;
    		}
    		arr[rear] = ele;
    		rear = rear + 1 % MaxLen;
    		return true;
    	}
    	//显示队列中全部数据
    	public void showQueue()
    	{
    		for (int i = front + 1; i <= rear; i++)
    		{
    			Console.WriteLine(arr[i]);
    		}
    	}
    	//将队首弹出
    	public int pop()
    	{
    		if (isEmply())
    		{
    			throw new Exception();
    		}
    		var result=arr[front];
    		front = front + 1 % front;
    		return result;
    	}
    
    	//显示队首
    	public int headQueue()
    	{
    		if (isEmply())
    		{
    			throw new Exception();
    		}
    		return arr[front];
    	}
    }
    
  • 相关阅读:
    查看linux命令类型
    理解bashrc和profile[转载]
    问题:ldconfig
    箭头函数
    闭包函数
    方法
    手把手教你使用百度地图(图解)
    变量作用域与解构赋值
    iterable
    Map和Set
  • 原文地址:https://www.cnblogs.com/aoximin/p/13072757.html
Copyright © 2011-2022 走看看