C#数据结构与算法揭秘二 线性结构

C#数据结构与算法揭秘二 线性结构

线性结构是指数据元素之间一对一的关系,即数据元素之间存在一个前驱和一个后继。一般有两种基本形式:线性表和栈、队列。

  • 线性表

线性表是由同类型数据元素构成有序序列的线性结构,常被用于实现基于数组的数据结构,如向量、矩阵等。

线性表可以分为顺序表和链表两种。

顺序表(Sequence List):是把线性表的元素按照顺序存储在一段连续的内存空间中,又叫连续存储结构。

示例说明:以下是使用C#语言,对线性表的顺序存储结构操作的示例代码。

class SeqList<T>
{
    private T[] data;
    private int size;

    public SeqList(int capacity)
    {
        data = new T[capacity];
        size = 0;
    }

    //查找元素
    public int Find(T item)
    {
        for (int i = 0; i < size; i++)
        {
            if (data[i].Equals(item))
            {
                return i;
            }
        }
        return -1;
    }

    //添加元素
    public void Add(T item)
    {
        if (size==data.Length) //数组满了,需要扩容
        {
            Resize(2 * data.Length);
        }
        data[size] = item;
        size++;
    }

    //删除元素
    public void Remove(T item)
    {
        int index = Find(item);
        if (index==-1)
        {
            return;
        }
        for (int i = index+1; i < size; i++)
        {
            data[i - 1] = data[i];
        }
        size--;
        if (size==data.Length/4 && data.Length/2!=0) //当元素个数少于数组容量的一半,缩小数组
        {
            Resize(data.Length / 2);
        }
    }

    //扩容方法
    private void Resize(int newCapacity)
    {
        T[] newData = new T[newCapacity];
        for (int i = 0; i < size; i++)
        {
            newData[i] = data[i];
        }
        data = newData;
    }
}
  • 栈和队列

栈(Stack):一种线性结构,先进后出(Last In First Out)。

示例说明:以下是使用C#语言,对栈的操作的示例代码。

class Stack<T>
{
    private T[] data;
    private int size;

    public Stack()
    {
        data = new T[2];
        size = 0;
    }

    //压栈
    public void Push(T item)
    {
        if (size==data.Length)
        {
            Resize(2 * data.Length);
        }
        data[size] = item;
        size++;
    }

    //出栈
    public T Pop()
    {
        if (IsEmpty())
        {
            throw new InvalidOperationException("Stack is empty");
        }
        T item = data[size - 1];
        size--;
        if (size==data.Length/4 && data.Length/2!=0)
        {
            Resize(data.Length / 2);
        }
        return item;
    }

    //获取栈顶元素
    public T Peek()
    {
        if (IsEmpty())
        {
            throw new InvalidOperationException("Stack is empty");
        }
        return data[size - 1];
    }

    //判断栈是否为空
    public bool IsEmpty()
    {
        return size == 0;
    }

    //栈的数组大小调整
    private void Resize(int newCapacity)
    {
        T[] newData = new T[newCapacity];
        for (int i = 0; i < size; i++)
        {
            newData[i] = data[i];
        }
        data = newData;
    }

}

队列(Queue):一种线性结构,先进先出(First In First Out)。

示例说明:以下是使用C#语言,对队列的操作的示例代码。

class Queue<T>
{
    private T[] data;
    private int front;
    private int tail;
    private int size;

    public Queue(int capacity)
    {
        data = new T[capacity];
        front = 0;
        tail = 0;
        size = 0;
    }

    //入队
    public void Enqueue(T item)
    {
        if (size == data.Length) //队列满了,需要扩容
        {
            Resize(2 * data.Length);
        }
        data[tail] = item;
        tail = (tail + 1) % data.Length; //tail指针绕一圈回到头部
        size++;
    }

    //出队
    public T Dequeue()
    {
        if (IsEmpty())
        {
            throw new InvalidOperationException("Queue is empty");
        }
        T item = data[front];
        front = (front + 1) % data.Length; //front指针绕一圈回到头部
        size--;
        if (size == data.Length / 4 && data.Length / 2 != 0) //当元素个数少于数组容量的一半,缩小数组
        {
            Resize(data.Length / 2);
        }
        return item;
    }

    //获取队首元素
    public T GetFront()
    {
        if (IsEmpty())
        {
            throw new InvalidOperationException("Queue is empty");
        }
        return data[front];
    }

    //获取队列大小
    public int GetSize()
    {
        return size;
    }

    //判断队列是否为空
    public bool IsEmpty()
    {
        return front == tail;
    }

    //队列的数组大小调整
    private void Resize(int newCapacity)
    {
        T[] newData = new T[newCapacity];
        for (int i = 0; i < size; i++)
        {
            newData[i] = data[(front + i) % data.Length];
        }
        data = newData;
        front = 0;
        tail = size;
    }
}

以上是对线性结构的一些常见操作和代码实现,同时在实际的开发中,我们根据具体的需求,将会针对性的选择不同的数据结构来完成我们的任务和目标。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#数据结构与算法揭秘二 线性结构 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java数据结构之双向链表的实现

    Java数据结构之双向链表的实现 一、双向链表的定义 双向链表是一种包含两个指针的链表数据结构,每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。 二、双向链表的实现 1. 定义节点 首先,我们需要定义一个节点类,包含节点的值,指向前一个节点的指针pre和指向后一个节点的指针next,代码如下: public class Node { int v…

    数据结构 2023年5月17日
    00
  • golang优先级队列的实现全过程

    下面是关于”golang优先级队列的实现全过程”的详细讲解。 什么是优先级队列? 优先级队列是一种常用的数据结构,它可以帮我们按照一定规则(即优先级)将元素按照大小排序,并支持快速插入、删除和查询最大或最小的元素等操作。我们可以将优先级队列想象成一个具有优先级的、自动排序的队列,其中优先级高的元素(比如数字大的元素)排在前面,优先级低的元素(比如数字小的元素…

    数据结构 2023年5月17日
    00
  • Java数据结构之有向图的拓扑排序详解

    下面我将为您详细讲解“Java数据结构之有向图的拓扑排序详解”的完整攻略。 拓扑排序概述 拓扑排序是一种常见的有向无环图(DAG)的排序方法,该算法将DAG图中所有节点排序成一个线性序列,并且使得所有的依赖关系都满足从前向后的顺序关系。一般来说,DAG图的所有节点可以表示为一个任务依赖关系,而拓扑排序则可以对这些任务进行排序,确保每个任务在它所依赖的任务之后…

    数据结构 2023年5月17日
    00
  • Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)

    Java数据结构及算法实例:快速计算二进制数中1的个数 简介 本文将介绍在Java中快速计算二进制数中1的个数的算法。本算法是一种基于位运算的算法,其核心思想是利用位运算的快捷性,将原问题转化为每次计算一位是否为1的问题,使得计算速度大大提升。 背景知识 在理解本算法之前,需要了解Java中的一些背景知识: 1. 位运算 Java中的位运算符有如下几个: &…

    数据结构 2023年5月17日
    00
  • C语言学习之链表的实现详解

    下面我将详细讲解“C语言学习之链表的实现详解”的完整攻略。 1. 链表的定义 链表是一种数据结构,它由一系列节点组成。每个节点由一个数据部分和一个指向下一个节点的地址部分组成。链表可以有多种形式,例如单向链表、双向链表、循环链表等。 2. 链表的实现 2.1. 单向链表 单向链表是最简单的链表形式,一个节点只包含一个指向下一个节点的指针。在C语言中,我们可以…

    数据结构 2023年5月17日
    00
  • Unity接入高德开放API实现IP定位

    Unity接入高德开放API实现IP定位攻略 本文将详细介绍如何在Unity中接入高德开放API实现IP定位功能。 准备工作 在开始之前,需要准备以下内容: 高德开放平台账号 Unity集成开发环境 一台联网的电脑或手机 开始集成 1. 创建Unity项目 首先,我们需要在Unity中创建一个新的项目。 2. 导入AMap3D SDK 将下载好的AMap3D…

    数据结构 2023年5月17日
    00
  • 详解Java实现数据结构之并查集

    详解Java实现数据结构之并查集 简介 并查集是一种基于树型结构的数据结构,主要用于解决一些不交集问题。它支持两个操作: 合并两个元素所在的集合 判断两个元素是否在同一个集合中 在并查集中,每个节点都有一个指向其父节点的指针。如果一个节点的指针指向它本身,说明它是一个集合的根节点。 实现 我们用一个int类型的数组parent来表示每个节点的父节点。初始时,…

    数据结构 2023年5月17日
    00
  • C语言线性表顺序表示及实现

    C语言线性表顺序表示及实现 线性表的概念 线性表是一种数据结构,它是由n(n≥0)个数据元素a1,a2,…,an 组成的有限序列(元素个数为0时,称为空表),并且这些数据元素遵循一定的线性关系。 线性表的存储结构 线性表的存储结构有两种:顺序存储和链式存储。顺序存储指的是用一段连续的存储单元依次存储线性表的数据元素,线性表中的元素在物理位置上也是相邻的;…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部