zoukankan      html  css  js  c++  java
  • 静态数组和动态数组

    1. using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace DataStructure.Review
      {
          public class Array2<T>
          {
              //静态数组
              public T[] data;
              //数组当前长度
              public int N;
      
              //构造函数设置容量
              public Array2(int capacity)
              {
                  data = new T[capacity];
                  this.N = 0;
              }
      
              public Array2():this(10)
              {
              }
      
      
              //数组当前存在的元素个数
              public int Count
              {
                  get { return this.N; }
              }
      
              //数组容量
              public int Capacity
              {
                  get { return this.data.Length; }
              }
      
      
              public void Add(int index, T e)
              {
                  if(index<0||index>N)
                  {
                      throw new Exception("数组越界");
                  }
      
                  //如果数组当前存储的元素达到动态数组的容量,开启扩容。注意:不是index=capacity
                  if (N==this.Capacity)
                  {
                      //throw new Exception("数组容量已满");
      
                      //扩容
                      ResetCapacity(data.Length*2);
                  }
      
                  for (int i = N-1; i >=index; i--)
                  {
                      data[i + 1] = data[i];
                  }
                  data[index] = e;
                  N++;
              }
      
              public void AddFirst(T e)
              {
                  Add(0,e);
              }
      
              public void AddLast(T e)
              {
                  Add(N, e);
              }
      
      
              public T RemoveAt(int index)
              {
                  if (index < 0 || index >= N)
                  {
                      throw new Exception("数组越界");
                  }
                  T curE = data[index];
                  //当前索引后面的元素前移
                  for (int i = index+1; i < N; i++)
                  {
                      data[i - 1] = data[i];
                  }
      
                  /**
                   * N--;
                  data[N] = default(T);
                  可以互换,但是要注意data[]的索引
                   */
                  N--;
      
                  //移动完成后,重置最后一个元素
                  data[N] = default(T);
      
                  if (N==data.Length/4)
                  {
                      ResetCapacity(data.Length/2);
                  }
                  return curE;
      
              }
      
              public void RemoveFirst()
              {
                  RemoveAt(0);
              }
      
              public void RemoveLast()
              {
                  RemoveAt(N-1);
              }
      
      
              public void Set(int index, T e)
              {
                  if (index < 0 || index >= N)
                  {
                      throw new Exception("数组越界");
                  }
                  data[index] = e;
              }
      
              public T Get(int index)
              {
                  if (index < 0 || index >= N)
                  {
                      throw new Exception("数组越界");
                  }
                  return data[index];
              }
      
              public T GetFirst()
              {
                  return data[0];
              }
      
              public T GetLast()
              {
                  return data[N-1];
              }
      
              public bool Contains(int e)
              {
                  for (int i = 0; i < N; i++)
                  {
                      if (data[i].Equals(e))
                      {
                          return true;
                      }
                  }
                  return false;
              }
      
              public int IndexOf(int e)
              {
                  for (int i = 0; i < N; i++)
                  {
                      if (data[i].Equals(e))
                      {
                          return i;
                      }
                  }
                  return -1;
              }
      
              //重置容量
              private void ResetCapacity(int capacity)
              {
                  T[] newData = new T[capacity];
                  for (int i = 0; i < N; i++)
                  {
                      newData[i] = data[i];
                  }
      
                  data = newData;
              }
      
              
              public override string ToString()
              {
                  StringBuilder sb = new StringBuilder();
                  sb.Append($"当前数组的容量是{this.data.Length},元素个数是{this.N}……数组元素依次是:");
                  sb.Append("[");
                  for (int i = 0; i < this.N; i++)
                  {
                      if (i < this.N - 1)
                      {
                          sb.Append(data[i] + ",");
                      }
                      else
                      {
                          sb.Append(data[N-1]);
                      }
                  }
                  
                  sb.Append("]");
                  return sb.ToString();
              }
          }
      }
      
      静态数组
    特点:可以通过索引可以访问任意元素;
    缺点:在初始化的时候就需要知道元素的数量;
     
    1. 动态数组
    可以解决静态数组的缺点。
    但是空间还是不能充分利用。
     

  • 相关阅读:
    高精度加法和减法。加法还好,减法花了不少时间。
    整数拆分
    二叉搜索树的中位数
    基本有序数组的排序
    log4j手册
    mysql技巧
    vim配置文件
    regex for python like preg_match of php
    字符串按word反转
    the little redis 阅读笔记
  • 原文地址:https://www.cnblogs.com/wesley168/p/14794023.html
Copyright © 2011-2022 走看看