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数据结构和算法中数组的简单入门”的攻略。 数组的定义和介绍 在Java中,数组是同一类型的数据元素的集合,元素可以通过索引进行访问。数组的元素可以是各种类型的数据,包括整数,浮点数,字符和字符串等。 在Java中,数组是一个对象。这意味着数组变量是对数组对象的引用,而不是数组对象本身。当你声明一个数组时,你实际上声明了一个数组引用变量。…

    数据结构 2023年5月17日
    00
  • C语言顺序表的基本结构与实现思路详解

    C语言顺序表的基本结构与实现思路详解 什么是顺序表 顺序表,顾名思义,就是使用连续的存储空间来存储数据元素的线性表。在顺序表中,每一个数据元素都占用一个连续的存储单元,这些存储单元在物理上连续存放,因此,顺序表实际上就是由一个存储数据元素的数组和记录该数组大小的变量组成的。 顺序表的基本结构 顺序表的定义 “`c #define MAXSIZE 100 /…

    数据结构 2023年5月17日
    00
  • Java数据结构之线索化二叉树的实现

    Java数据结构之线索化二叉树的实现 线索化二叉树的概述 线索化二叉树(Threaded Binary Tree)是一种优化的二叉树结构。它的优点是可以在O(n)的时间复杂度内,进行中序遍历。而在普通二叉树中进行中序遍历需要的时间复杂度是O(nlogn)。线索化二叉树的原理是利用空闲的指针域,来记录中序遍历中前驱与后继结点的位置。线索化二叉树中会出现两种类型…

    数据结构 2023年5月17日
    00
  • 数据结构与算法大作业:走迷宫程序(C语言,DFS)(代码以及思路)

    好家伙,写大作业,本篇为代码的思路讲解   1.大作业要求 走迷宫程序 问题描述: 以一个 m * n 的长方阵表示迷宫, 0和1分别表示迷宫的通路和障碍。 设计一个程序, 对任意设定的迷宫, 求出一条从入口到出口的通路, 或得出没有通路的结论。 基本要求: (1) 实现一个以链表做存储的栈类型, 然后编写一个求解迷宫的非递归程序。 求的通路以三元组(i, …

    算法与数据结构 2023年5月9日
    00
  • C语言 数据结构之数组模拟实现顺序表流程详解

    C语言 数据结构之数组模拟实现顺序表流程详解 什么是顺序表? 顺序表是一种基于连续存储结构的数据结构,它可以用一段连续的存储单元来存储线性表中的所有元素。 顺序表的实现思路 顺序表的实现主要依赖数组。我们可以定义一个数组来存储线性表的数据元素,同时再定义一个变量来保存线性表当前的长度。当需要对线性表进行插入、删除、查找等操作时,根据需求,可以通过数组的下标来…

    数据结构 2023年5月17日
    00
  • C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 什么是快速排序? 快速排序(Quicksort)是一种采用分治法(Divide and Conquer)的排序算法,通过将一个大问题逐步分解为小问题来解决的一种工具。 快速排序是一个比较快的排序算法,在平均状况下,排序n个项目要 O(n log n) 次比较,最坏情况下需要O(n^2)次比较,但这种状况并不常见。 快速排序算…

    数据结构 2023年5月17日
    00
  • Python实现的数据结构与算法之双端队列详解

    Python实现的数据结构与算法之双端队列详解 什么是双端队列? 双端队列是一种具有队列和栈的性质的数据结构,可以在队列两端进行插入和删除操作。双端队列可以实现两端的操作,因此可以在队列两端进行插入和删除操作,既可以像队列一样先进先出,也可以像栈一样后进先出。 双端队列的操作 add_front(item):在队头插入一个元素; add_rear(item)…

    数据结构 2023年5月17日
    00
  • 京东LBS推荐算法实践

    作者:京东零售 郑书剑 1、推荐LBS业务介绍 1.1 业务场景 现有的同城购业务围绕京东即时零售能力搭建了到店、到家两种业务场景。同城业务与现有业务进行互补,利用高频,时效性快的特点,可以有效提升主站复访复购频次,是零售的重要战略方向。 1.2 名词解释 LBS:基于位置的服务(Location Based Services)。 下文LBS商品代指京东小时…

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