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

yizhihongxing

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日

相关文章

  • Go语言数据结构之二叉树必会知识点总结

    Go语言数据结构之二叉树必会知识点总结 二叉树是一种非常重要的数据结构,它被广泛应用于算法、数据处理等领域。在Go语言中,使用二叉树可以实现很多高级数据结构和算法。本文将为大家介绍二叉树相关的基本知识和操作,以及如何利用Go语言实现二叉树。 什么是二叉树? 二叉树是一种树形结构,由一个根节点和两个子树组成。它的每个节点最多有两个子节点,称为左子节点和右子节点…

    数据结构 2023年5月17日
    00
  • 「学习笔记」二分图

    「学习笔记」二分图 点击查看目录 目录 「学习笔记」二分图 知识点 定义及判定 二分图最大匹配 二分图最小点覆盖 二分图最大独立集 例题 P7368 [USACO05NOV]Asteroids G 思路 P2319 [HNOI2006]超级英雄 思路 Way Selection 题意 思路 文理分班 题意 思路 放置机器人 题意 思路 猫和狗 题意 思路 知…

    算法与数据结构 2023年4月18日
    00
  • 第14届蓝桥杯C++B组省赛题解(A-J)(更新完毕)

    目录 A. 日期统计 题目内容 思路 代码 答案 B.01 串的熵 题目内容 思路 代码 答案 C.冶炼金属 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 D.飞机降落 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 E.接龙数列 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 F.岛屿数量 题目内容 输入格式 输…

    算法与数据结构 2023年4月25日
    00
  • JavaScript数据结构常见面试问题整理

    JavaScript数据结构常见面试问题整理 介绍 JavaScript是一种广泛使用的脚本语言,用于在Web上创建动态效果,验证表单,增强用户体验等。它是一种高级语言,使用许多数据结构来存储和处理数据。在面试中,考官通常会问一些与JavaScript数据结构相关的问题,这篇文章将整理一些常见的面试问题和他们的解答,以便帮助你做好准备。 常见问题 1. 什么…

    数据结构 2023年5月17日
    00
  • Codeforces Round 868 Div 2

    A. A-characteristic (CF 1823 A) 题目大意 要求构造一个仅包含\(1\)和 \(-1\)的长度为 \(n\)的数组 \(a\),使得存在 \(k\)个下标对 \((i, j), i < j\)满足 \(a_i \times a_j = 1\)。 解题思路 当有\(x\)个 \(1\), \(y\)个 \(-1\)时,其满足…

    算法与数据结构 2023年4月30日
    00
  • 一文带你走进js数据类型与数据结构的世界

    一文带你走进JS数据类型与数据结构的世界 一、JS数据类型 1. 原始类型 JS中原始类型包括:Undefined、Null、Boolean、Number、String、Symbol(ES6新增)。 其中Undefined和Null分别代表未定义和空值,Boolean表示布尔值,Number表示数字,String表示字符串,Symbol是ES6新增的一种基础…

    数据结构 2023年5月17日
    00
  • C语言中关于树和二叉树的相关概念

    C语言中关于树和二叉树的相关概念 树的概念 在计算机科学中,树是一种非常常见的数据结构,它由一组节点(通常称为元素)和一组连接节点的边组成。树是一种无向的、连通的、无环的图形结构,其中有一个节点被称为根节点,它没有父节点,而其他节点都有一个父节点。 树的定义很抽象,但在程序设计中,我们通常会使用一个节点类来实现树结构。一个节点类通常包含两个元素:一个是表示当…

    数据结构 2023年5月17日
    00
  • 【ACM数论】和式变换技术,也许是最好的讲解之一

    在做数论题时,往往需要进行和式变换,然后变换成我们可以处理的和式,再针对和式做筛法、整除分块等操作。 本文将介绍一些常见的和式变换技术。 以下出现的概念大部分为个人总结,未必是学术界/竞赛界的统一说法,有不严谨的地方请谅解。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流…

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