数据结构(C#部分算法总结)

顺序表

结构体:

 struct Stud1 {

        public int no;

        public string name;

        public double score;

}

类名:StudClass

成员变量:最大长度MaxSize

          const int MaxSize = 100;

          实例化一个结构体对象st

          Stud1[] st = new Stud1[MaxSize];

          表长 int n;

方法:

  1. 创建顺序表

public void Create()

关键点:需记住结构体的调用 st[0].属性=;

  1. 根据位置查找元素

        public bool Findi(int i, out string na, out double sc)

        关键点:用了out  需要在方法中初始化

                 na = "";

                sc = 0;

线性表(链式存储)

注:指针对象与结点对象的区别,LinkList s;//指针对象,没有初始化

                              LinkList()  s = new LinkList();//结点对象,初始化了

指针类:

类名:LinkList

成员变量:数据域data

          指针域LinkList next

链表类:

类名:LinkListClass

注:需先实例化一个指针对象(LinkList)head头指针

方法:

  1. 头插法建立单链表(即一致在头结点和首结点之间插入结点)

public void CreateListF(string[] split)

关键点:通过实例化一个结点对象s将字符数组中的元素遍历到s.data(迭代方式s = s.next)

        初始化head=null,并迭代head.next=s(即每次新建一个结点,都head.next=它)

  1. 尾插法建立单链表

   public void CreateListR(string[] split)

   关键点:通过实例化一个指针对象r,将r指向头结点,同时也实例化一个s结点对象,将数组中的元素存入s.data中,并令r=s(即一直随插入结点移动),最后令尾节点为空r.next=null

  1. 将链表一字符串形式返回

   public string DispList()

   关键点:实例化一个指针对象r,将r指向head.next,迭代r.data

  1. 求链表的长度

   public int ListLength()

   关键点:实例化一个指针对象r,让r刚开始指向头结点,只要r.next不等于空,迭代,并令一个数字+1

  1. 求链表中某个位置数据元素的值

   public bool GetElem(int i,out string e)

   关键点:实例化一个指针对象,并让该指针对象指向头结点,只要r.next!=null迭代找到i-1位置并赋值给e

  1. 按元素值找位置

   public int LocateElem(string e)

   关键点:实例化一个指针对象r指向头结点,只要r.next!=null迭代找到r.data==e(在这过程中用数字迭代位置)

  1. 插入元素

   public bool ListInsert(int i, string e)

   关键点:实例化一个指针p指向头结点,找到i-1位置,实例化一个结点对象r,令r.data=e,

           r.next=(p.next).next,p.next=r

顺序串

注:本类的成员变量调用不需要写类对象(如直接data,其他类需要通过实例化的类对象调用成员变量)

类名:SqStringClass

成员变量:

         最大长度MaxSize

         数据域data(字符数组char[])

         长度

构造函数

         初始化数据域(即为数据与初始化大小)

         初始化长度为0

方法:

  1. 新建串(通过传入字符串新建)

遍历字符串数组传给data数组

根据字符串长度修改串长

public void StrAssign(string str)

  1. 复制串(即将一个串复制给另一个串)

public void StrCopy(SqStringClass a)

  1. 求串长

     public int StrLength()

  1. 串连接(通过实例化一个nstr对象分别将两个串对象数据(一个本身一个传入的对象)赋值给nstr)

     public SqStringClass ConStr(SqStringClass a)

注:涉及到要在串的内部进行插入删除或求字串的方法,需要对传入的位置参数(逻辑下标)进行判断,起始点不能小于0,终点不能大于length+1(且很多方法需实例化第三个串并对它操作,最后返回它)

  1. 串插入(串插入,在逻辑位置i的位置插入串s,给新串nstr)

     public SqStringClass InsStr(int i, SqStringClass s)

  1. 串删除(串删除, 删除的起始下标为i-1,结束下标为i + j -1)

     public SqStringClass DelStr(int i, int j)

  1. 串替换(替换起始下标i-1,结束下标j + i -1)

     public SqStringClass RepStr(int i, int j ,SqStringClass s)

注:以上的i 代表从第i个开始,j代表从i开始长度为j的相应的串位置进行操作

顺序栈

注意:进栈操作需判断栈是否已满即top==MaxSize-1

      出栈操作需判断是否栈为空即top==-1

      进出栈直接对数据域data进行操作如 string e = data[top];top--;

                                        Data[top]= e;top++;

                                        

类名:SqStackClass

成员变量:最大长度 MaxSize

          数据域 data(字符串数组)

          栈顶指针

构造函数:为数据域分配存储空间即data = new string[MaxSize];

          栈顶指针初始化 top = -1;

方法:

  1. 判断栈是否为空

   public bool StackEmpty()//直接return{top == -1};

  1. 进栈

   public bool Push(string e)

  1. 出栈

   public bool Pop(out string e)

  1. 取栈顶元素

   public bool GetTop(out string e)//只是取,所以不用top--

  1. 输出栈中所有元素,以字符串返回

   public string DispStack()//实例化一个字符串对象mystr返回,遍历栈(条件top != -1)

二维数组(行列优先存储,通过行列下标求元素位置)

关键点:通过实例化六个全局变量,即:

int c1;//数组行起始下标

                                      int d1;//数组行终止下标

 

                                      int c2;//数组列起始下标

                                      int d2;//数组列终止下标

 

                                      int loc;//数组起始位置

                                      int k;//数组元素大小

          然后分别更具行有先或列优先存储公式进行计算

          //行优先存储

          locij = loc + ((i - c1) * (d2 - c2 + 1) + (j - c2)) * k;

          locij = loc + ((j - c2) * (d1 - c1 + 1) + (i - c1)) * k;

二叉树

类名:BTNodeClass

内部类:BTNode

         成员变量:数据域data(char)

                  BTNode结点对象(指向左孩子):lchild

                  BTNode结点对象(指向右孩子):rchild

成员变量:最大长度 MaxSize(用于顺序栈的存储空间分配)

         BTNode(根结点对象)r

         递归算法返回字符串bstr(string)

构造方法:初始化二叉树,即

          r.lchild = r.rchild = null;

方法:

  1. 由输入的括号表达式的字符串创建二叉链

public void CtreateBTNode(string str)

关键点:需通过实例化一个顺序栈(数据类型BTNode,BTNode[] st = new BTNode[MaxiSize])

        用于存储括号表达式中的结点。用循环嵌套switch对( ) ,进行判断

        且通过定义一个int k来对相应的判断赋值,k=1 左孩子 k=2右孩子

BTNode[] st = new BTNode[MaxSize];//创建一个顺序栈

            BTNode p = null;

            int top = -1, k = 0, j = 0;

            char ch;

            r = null;//建立二叉树初始时为空

            while (j < str.Length)

            {//遍历数组str中的字符

                ch = str[j];

                switch (ch)

                {

                    case '(':

                        //开始处理左孩子结点

                        top++;

                        st[top] = p;

                        k = 1;

                        break;

                    case ')':

                        top--;

                        break;

                    case ',':

                        //开始处理右孩子结点

                        k = 2;

                        break;

                    default:

                        //创建一个新的结点

                        p = new BTNode();

                        p.lchild = p.rchild = null;

                        p.data = ch;

                        if (r == null)//如果根结点为空

                        {

                            r = p;//则将p赋值给r

                        }

                        else

                        {

                            switch (k)

                            {//否则对k进行遍历

                                //默认1为左孩子,为2为右孩子

                                case 1:

                                    st[top].lchild = p;

                                    break;

                                case 2:

                                    st[top].rchild = p;

                                    break;

                            }

                        }

                        break;

                }

                j++;

            }

  1. 求二叉树的高度

public int Count()

{

      return Count1(r);

    }

private int Count1(BTNode t)

关键点:先判断根结点是否为空,然后通过方法重复执行来计数

  1. 将二叉树转化成括号表示法,以字符串返回

    public string DispBTNode()

        {

            btstr = "";

            DispBTNode1(r);

            return btstr;

        }

private void DispBTNode1(BTNode t)

关键点:判断根结点是否为空,先将根节点的t.data.string赋值给btstr,然后判断根结点的左右孩子是否存在

btstr += t.data.ToString();

                if (t.lchild != null || t.rchild != null)

                {

                    btstr += "(";

                    DispBTNode1(t.lchild);

                    if (t.rchild != null)

                    {

                        btstr += ",";

                    }

                    DispBTNode1(t.rchild);

                    btstr += ")";

                }

  1. 求总结点个数

    public int Count()

        {

            return Count1(r);

        }

        private int Count1(BTNode t)

关键点:通过对结点反复调用Count1()函数,来进行计数,以下计数方法同理

n1 = Count1(t.lchild);

                n2 = Count1(t.rchild);

                return n1 + n2 + 1;//

  1. 求叶子结点个数

   public int LeafCount()

        {

            return LeafCount1(r);

        }

        private int LeafCount1(BTNode t)

  1. 求单分支结点个数

    public int SingleCount()

        {

            return SingleCount1(r);

        }

        private int SingleCount1(BTNode t)

  1. 求双分支结点个数

   public int DoubleCount()

        {

            return DoubleCount1(r);

        }

        private int DoubleCount1(BTNode t)

注:求结点个数的方法都以int类型返回

猜你喜欢

转载自blog.csdn.net/qq_42049445/article/details/85319405
今日推荐