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日

相关文章

  • JavaScript树形数据结构处理

    对于“JavaScript树形数据结构处理”的完整攻略,我将从以下几个方面进行讲解: 树形数据结构的简介 树形数据结构在JavaScript中的表示 树形数据结构的处理方法 示例说明 树形数据结构的简介 树形数据结构,是一种常见的数据结构,由多个节点组成,每个节点有一个父节点和多个子节点。树形数据结构通常用来表示层级关系的数据。 树形数据结构在JavaScr…

    数据结构 2023年5月17日
    00
  • 带头节点的单链表的思路及代码实现

    带头节点的单链表的思路及代码实现(JAVA) 一、什么是的单链表 ①标准定义 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。) 以上是标准定义不太好让人对单链表有直观…

    算法与数据结构 2023年4月17日
    00
  • C语言数据结构之队列算法详解

    C语言数据结构之队列算法详解 什么是队列? 在计算机科学中,队列是一种抽象数据类型或线性数据结构。它具有先进先出(FIFO)的特性,即先进入队列的元素先被处理或先被移除。队列通常用于解决先到先服务的问题(如请求处理),但也常用于广泛的异步编程中。 队列的特点 队列通常具有以下特点: 队列可以为空; 队列从队首插入元素,从队尾移除元素; 队列只允许从队尾插入元…

    数据结构 2023年5月17日
    00
  • F – 产生冠军(不使用拓扑排序)

    题目描述 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之…

    算法与数据结构 2023年4月17日
    00
  • Java数据结构顺序表的详细讲解

    Java数据结构顺序表的详细讲解 什么是顺序表? 顺序表是一种线性结构,它通过一段连续的存储空间来存储一组元素,每个元素占用一个固定大小的存储单元,元素之间按照一定的顺序紧密排列。 顺序表的实现 在Java中,顺序表可以通过数组实现。数组是一种非常基础的数据结构,它可以用来存储相同类型的数据,数组元素的地址是连续的,因此可以通过下标访问数组中的元素。 实现步…

    数据结构 2023年5月17日
    00
  • C++ 数据结构超详细讲解顺序表

    C++ 数据结构:超详细讲解顺序表 什么是顺序表 顺序表是一种线性结构,它用一段地址连续的存储单元依次存储线性表中的各个元素。 顺序表的结构 顺序表由两部分组成,分别是元素存储区和表长度信息。元素存储区通常用数组实现,表长度信息记录表中元素的个数。 顺序表的操作 常见的顺序表操作包括: 初始化操作 插入操作 删除操作 查找操作 遍历操作 初始化顺序表 初始化…

    数据结构 2023年5月17日
    00
  • C++数据结构AVL树全面分析

    C++数据结构AVL树全面分析 简介 AVL树是一种二叉搜索树,它通过使树保持高度平衡来提高搜索、插入和删除操作的效率。AVL树本质上是通过在插入和删除节点时旋转子树来保持平衡的。AVL树被认为是最早的自平衡二元搜索树。 AVL树的定义 AVL树是一种满足以下特性的BST: 每个节点都有一个左子树和一个右子树,并且左子树、右子树也是AVL树。 左子树高度和右…

    数据结构 2023年5月17日
    00
  • Golang实现数据结构Stack(堆栈)的示例详解

    Golang实现数据结构Stack(堆栈)的示例详解 什么是Stack? Stack,也称为堆栈,是一种先进后出(Last In First Out, LIFO)的数据结构。举个例子,比如一堆书,你按照一定的顺序叠起来,然后你想要拿出第一本,你需要先拿掉上面的书才能取到下面的。这就是典型的堆栈模型。 在编程中,Stack也是一种非常常见的数据结构,特别是在函…

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