package ds import "testing" func TestStackBasic(t *testing.T) { var s Stack[int] if !s.Empty() { t.Fatal("新建栈应为空") } if _, ok := s.Pop(); ok { t.Fatal("空栈 Pop 应返回 false") } if _, ok := s.Peek(); ok { t.Fatal("空栈 Peek 应返回 false") } s.Push(1) s.Push(2) s.Push(3) if s.Len() != 3 { t.Fatalf("Len = %d, want 3", s.Len()) } // LIFO 顺序 for _, want := range []int{3, 2, 1} { got, ok := s.Pop() if !ok { t.Fatalf("Pop 失败,期望 %d", want) } if got != want { t.Fatalf("Pop = %d, want %d", got, want) } } if !s.Empty() { t.Fatal("全部弹出后应为空") } } func TestStackStringType(t *testing.T) { var s Stack[string] s.Push("a") s.Push("b") top, ok := s.Peek() if !ok || top != "b" { t.Fatalf("Peek = %q,%v, want \"b\",true", top, ok) } v, _ := s.Pop() if v != "b" { t.Fatalf("Pop = %q, want \"b\"", v) } } func TestStackLeakFunctional(t *testing.T) { // 功能性验证:大量 push/pop 交替后仍正确,间接验证无状态泄漏。 var s Stack[int] s.Push(1) s.Push(2) v, _ := s.Pop() if v != 2 { t.Fatalf("Pop = %d, want 2", v) } s.Push(3) v, _ = s.Pop() if v != 3 { t.Fatalf("Pop = %d, want 3", v) } v, _ = s.Pop() if v != 1 { t.Fatalf("Pop = %d, want 1", v) } if !s.Empty() { t.Fatal("应为空") } }