1. 程式人生 > >資料結構(C#部分演算法總結)

資料結構(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型別返回