C 演算法系列一基本資料結構

2021-09-07 20:51:22 字數 3181 閱讀 7406

一、簡介

作為乙個程式設計師,演算法是乙個永遠都繞不過去的話題,雖然在大學裡參加過acm的比賽,沒記錯的話,浙江賽區倒數第二,後來不知怎麼的,就不在care他了,但是現在後悔了,非常的後悔!!!如果當時好好學演算法的話,現在去理解一些高深的框架可能會很easy,現在隨著c#基礎和web技能的提公升,發現**都用到演算法,但是,很無奈.所以,從今天開始,要重新對自己定位,不能做乙個工具的使用者.起碼要做到知其所以然.好了,廢話不多說,演算法之旅,算是正式開始了.希望這個過程能貫穿我的整個職業生涯.甚至整個人生.

二、佇列

關於佇列,不多說,只要做了一兩年程式設計師,對他肯定不陌生,可以說**都有他.關於他的概念也很簡單.類似於我們生活中的排隊打飯,當然先排隊的肯定先打到飯.專業術語叫做先進先出.下面用基於object陣列的c#實現,**如下:

///

///自定義佇列

/// public

class

queue

//////

初始化指定容量的佇列

/// ///

public queue(int

capacity)

_array = new

object

[capacity];

_head = 0

; _tail = 0

; _size = 0

; }

//////

入隊

/// public

virtual

void enqueue(object

obj)

//////

出隊

/// ///

public

virtual

object

dequeue()

object result =_array[_head];

_array[_head] = null

; _head = _head + 1

; _size--;

return

result;

}//////

當前佇列的長度

/// public

int count }

}

控制台呼叫**如下:

class

program

,,,", q.dequeue(), q.dequeue(), q.dequeue(), q.dequeue());

console.readkey();}}

先進先出,但是有問題,上面給定初始長度為4,所以全域性陣列的長度為4,當你呼叫equeue方法5次,陣列會報溢位錯誤,所以,如果當前佇列的長度等於我們給它的初始值時,必須進行乙個陣列的copy操作,將當前陣列拷貝到乙個容量更大的陣列中去,這裡ms採用的演算法時,每次乘以2的遞增.修改**如下:

///

///自定義佇列

/// public

class

queue

//////

初始化指定容量的佇列

/// ///

public queue(int

capacity)

_array = new

object

[capacity];

_head = 0

; _tail = 0

; _size = 0

; }

//////

入隊

/// public

virtual

void enqueue(object

obj)

_array[_tail] =obj;

_tail = _tail + 1

; _size++;

}//////

出隊

/// ///

public

virtual

object

dequeue()

object result =_array[_head];

_array[_head] = null

; _head = _head + 1

; _size--;

return

result;

}//////

當前佇列的長度

/// public

int count }

//////

重新設定原始陣列的容量

/// private

void setcapacity(int

capacity)

}

ok,現在每次都會以原陣列*2的長度擴充套件原始陣列,但是還是有問題,如果這中間存在出隊,實際的_size會減一,但是陣列實際的長度還是為原來的,區別就是出隊的那個元素的位置會被設定為null,會存在以下bug:

var q = new

queue();

q.enqueue(1);

q.dequeue();

q.enqueue(2);

q.enqueue(3);

q.enqueue(4);

q.enqueue(5);

console.writeline(

"出隊:,,,

出隊,導致_size-1,但是原始陣列的長度還是為4,千萬不要說,dequeue的時候,讓第乙個元素的記憶體釋放陣列長度變為3,這是不可能的,至少我不知道.所以,這裡還需要對演算法進行改進.好了,到這裡我就做不下去了,看了ms的實現,估計是對陣列對了特殊的記憶體處理,沒有辦法處理出隊後第乙個元素為null,但是它還是會算到計算長度裡面去,如果引入新的變數去計算實際的長度,不用說,m目測會有記憶體浪費!mmp.如果你們有好的辦法,請告知.

C 資料結構與演算法系列 一 基本概念

在開始前先提出二個概念 時間複雜度與空間複雜度。時間複雜度是指該演算法的執行時間與問題規模的對應的關係。時間複雜度用t n 0 f n 來表示,其中0表示隨問題規模n的增大,演算法執行時間的增長率和f n 的增 長率相同,如果乙個沒有迴圈的 演算法的執行頻度是不會變的,記作0 1 當演算法中有乙個一...

演算法 基本資料結構

1 後進先出 2 棧有乙個屬性為s.top執行最新插入的元素 3 彈出稱為pop,插入稱為push 4 上溢和下溢 如果試圖對乙個空棧執行彈出操作,則稱為下溢 如果s.top超過了n,則稱為上溢,在下面偽 中不考慮上溢問題 1 先進先出 2 佇列有對頭head和對尾tail 3 插入稱為入隊 enq...

C 基本資料結構

目錄 c 基本資料結構 1.向量 2.佇列 3.棧以後會補充 include 順序儲存 empty size push back 尾部新增 pop back 尾部刪除 insert erase clear 首元素迭代器 begin 尾元素後乙個位置 end 訪問 1.0到size 1 2.定義迭代器...