Go轉型——資料結構初級(四)棧和隊列
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。**1**.棧和隊列棧和隊列是兩種常用的線性結構,從資料結構角度來看,棧和隊列也是線性表,其特殊性在於棧和隊列的基本操作實現性別操作的子集,他們是操作受限的線性表,因此也被稱為限定的資料結構。但從資料類型角度來看,他們是和線性表大不相同。**棧**:是限定僅在表尾進行插入或刪除操作的線性表。對於棧來說,表尾一端有特殊含義,稱為棧頂,相應的標題段稱之為棧底。不含任何元素的棧被稱作空棧。假設S=(a(1),a(2),a(3),.......a(n)),我們稱a(1)為棧底元素,a(n)為棧頂元素。進棧順序應為a(1),a(2),a(3),.......a(n),退棧的順序第一個元素應為棧頂元素。換句話說,棧的修改是按照後進先出的原則進行的,因此,棧又稱之為後進先出線性表(簡稱LIFO結構)。站的抽象資料類型定義如下:**2**.棧的表示和實現和線性表類似,展業有兩種儲存表示方法。**順序棧**:即棧的順序儲存結構是利用一組地址連續的儲存單元來依次儲存從棧底到棧頂的資料元素,同時還設定指標top指示棧頂元素在順序棧中的位置,以top=0來表示空棧。還有,由於棧在實際使用中大小不易估算,所以我們初始化設空棧時不應限定棧的最大容量,應該給棧分配一個基本容量,然後在應用過程中,當棧的空間不足時,再逐段擴大。**鏈棧**:操作方式與線性鏈表類似,不移動元素只更改指標域內容。**3**.棧的實際應用```gopackage mainimport ("log""fmt")type Stack struct {size int64 //棧的容量top int64 //棧頂data []interface{}}func MakeStack( size int64) Stack{s :=Stack{}s.size=sizes.data =make([]interface{},size)return s}//入棧,空間不足,逐段升高func (s *Stack) Push(e interface{}) bool{if s.IsFull(){log.Printf("棧滿,無法入棧") return false}s.data[s.top]=efmt.Println(s.top)s.top++return true}//出棧,棧頂降低func (s *Stack) Pop() (r interface{},err error){if s.IsEmpty() {err =fmt.Errorf("棧已空,無法完成出棧")log.Printf("棧已空,無法完成出棧")return}s.top--r =s.data[s.top]return}//判斷棧是否滿func (s *Stack) IsFull() bool{return s.top==s.size}//判斷棧是否為空白func (s *Stack) IsEmpty() bool{return s.top==0}func (s *Stack) Traverse(fn func(r interface{}),goorto bool) {//go true遍曆進棧 false 遍曆出棧if goorto { var i int64= 0for ;i<s.top;i++ {fn(s.data[i])}}else{for i:=s.top-1;i>=0;i-- {fn(s.data[i])}}}//進棧出棧實驗//求將十進位1348轉化為八進位func TestStack() {var fn_c = func(n int) {s :=MakeStack(10)for {if n==0 {break}s.Push(n%8)n =n/8}s.Traverse(func(r interface{}) {fmt.Print(r)},false)}fn_c(1348)}func main() {TestStack()}```這個程式還是有問題,將元素入棧時,會覆蓋第一個元素,最後棧中只留下一個2,求大神解答354 次點擊