資料結構(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;
方法:
- 建立順序表
public void Create()
關鍵點:需記住結構體的呼叫 st[0].屬性=;
- 根據位置查詢元素
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頭指標
方法:
- 頭插法建立單鏈表(即一致在頭結點和首結點之間插入結點)
public void CreateListF(string[] split)
關鍵點:通過例項化一個結點物件s將字元陣列中的元素遍歷到s.data(迭代方式s = s.next)
初始化head=null,並迭代head.next=s(即每次新建一個結點,都head.next=它)
- 尾插法建立單鏈表
public void CreateListR(string[] split)
關鍵點:通過例項化一個指標物件r,將r指向頭結點,同時也例項化一個s結點物件,將陣列中的元素存入s.data中,並令r=s(即一直隨插入結點移動),最後令尾節點為空r.next=null
- 將連結串列一字串形式返回
public string DispList()
關鍵點:例項化一個指標物件r,將r指向head.next,迭代r.data
- 求連結串列的長度
public int ListLength()
關鍵點:例項化一個指標物件r,讓r剛開始指向頭結點,只要r.next不等於空,迭代,並令一個數字+1
- 求連結串列中某個位置資料元素的值
public bool GetElem(int i,out string e)
關鍵點:例項化一個指標物件,並讓該指標物件指向頭結點,只要r.next!=null迭代找到i-1位置並賦值給e
- 按元素值找位置
public int LocateElem(string e)
關鍵點:例項化一個指標物件r指向頭結點,只要r.next!=null迭代找到r.data==e(在這過程中用數字迭代位置)
- 插入元素
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
方法:
- 新建串(通過傳入字串新建)
遍歷字串陣列傳給data陣列
根據字串長度修改串長
public void StrAssign(string str)
- 複製串(即將一個串複製給另一個串)
public void StrCopy(SqStringClass a)
- 求串長
public int StrLength()
- 串連線(通過例項化一個nstr物件分別將兩個串物件資料(一個本身一個傳入的物件)賦值給nstr)
public SqStringClass ConStr(SqStringClass a)
注:涉及到要在串的內部進行插入刪除或求字串的方法,需要對傳入的位置引數(邏輯下標)進行判斷,起始點不能小於0,終點不能大於length+1(且很多方法需例項化第三個串並對它操作,最後返回它)
- 串插入(串插入,在邏輯位置i的位置插入串s,給新串nstr)
public SqStringClass InsStr(int i, SqStringClass s)
- 串刪除(串刪除, 刪除的起始下標為i-1,結束下標為i + j -1)
public SqStringClass DelStr(int i, int j)
- 串替換(替換起始下標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;
方法:
- 判斷棧是否為空
public bool StackEmpty()//直接return{top == -1};
- 進棧
public bool Push(string e)
- 出棧
public bool Pop(out string e)
- 取棧頂元素
public bool GetTop(out string e)//只是取,所以不用top--
- 輸出棧中所有元素,以字串返回
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;
方法:
- 由輸入的括號表示式的字串建立二叉鏈
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++;
}
- 求二叉樹的高度
public int Count()
{
return Count1(r);
}
private int Count1(BTNode t)
關鍵點:先判斷根結點是否為空,然後通過方法重複執行來計數
- 將二叉樹轉化成括號表示法,以字串返回
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 += ")";
}
- 求總結點個數
public int Count()
{
return Count1(r);
}
private int Count1(BTNode t)
關鍵點:通過對結點反覆呼叫Count1()函式,來進行計數,以下計數方法同理
n1 = Count1(t.lchild);
n2 = Count1(t.rchild);
return n1 + n2 + 1;//
- 求葉子結點個數
public int LeafCount()
{
return LeafCount1(r);
}
private int LeafCount1(BTNode t)
- 求單分支結點個數
public int SingleCount()
{
return SingleCount1(r);
}
private int SingleCount1(BTNode t)
- 求雙分支結點個數
public int DoubleCount()
{
return DoubleCount1(r);
}
private int DoubleCount1(BTNode t)
注:求結點個數的方法都以int型別返回