由於最近工做中碰到了一些關於數據結構的問題,發現有些生疏了,因此想從新本身再理一遍,就當是給本身的記錄,之因此用golang主要也是由於對goalng比較感興趣,寫起來也比較順手。
本意也不是想分享關於什麼是數據結構,由於這種概念性的東西沒有什麼太大意義,其實最重要的是讓本身能看懂本身寫了些什麼,可是代碼中寫了很是詳細的註釋,因此基本都是以代碼爲主golang
順序存儲結構是線性表中的一種,如下代碼是線性表中的順序存儲結構的表述,基本略去了些容錯和美觀的考慮,仍是以實現功能爲主數據結構
package main //線性表中的順序存儲結構 import ( "fmt" ) // 線性表中存儲的數據類型 type Elem int type SqList struct { //最大長度 maxsize int // 當前長度 length int //保存數據 data []Elem } //初始化 func New(maxsize int) *SqList { return &SqList{maxsize: maxsize, data: make([]Elem, maxsize)} } //檢查線性表是否爲空 func (list *SqList) IsEmpty() bool { return 0 == list.length } //判斷線性表是否已滿 func (list *SqList) IsFull() bool { return list.length == list.maxsize } //在i個位置以前插入新的元素e,複雜度爲O(n) func (list *SqList) Insert(i int, e Elem) bool { if i < 1 || i > list.length { fmt.Println("pls check i:", i) return false } for k := list.length; k > i-1; k-- { list.data[k] = list.data[k-1] } list.data[i-1] = e list.length++ return true } //刪除位置爲i的元素,複雜度爲O(n) func (list *SqList) Del(i int) bool { if i < 1 || i > list.length { fmt.Println("pls check i:", i) return false } for k := i - 1; k < list.length-1; k++ { list.data[k] = list.data[k+1] } list.data[list.length-1] = 0 list.length-- return true } //獲取第i個位置的元素,複雜度爲O(1) func (list SqList) GetElem(i int) Elem{ if i < 1 || i > list.length { fmt.Println("pls check i:", i) return -1 } return list.data[i-1] } //追加一個元素 func (list *SqList) append(e Elem) bool { if list.IsFull() { fmt.Println("list is fulle") return false } list.data[list.length] = e list.length++ return true } func main() { sq := New(10) sq.append(99) sq.append(999) sq.append(9999) sq.append(99999) fmt.Println(sq) sq.Insert(4, 888) fmt.Println(sq) //fmt.Println(r) sq.Del(2) fmt.Println(sq) fmt.Println(sq.GetElem(3)) }