目录
一、概述
二、基本的用法
1.入栈
2.出栈
Pop 方法
Peek 方法
3.判断元素是否存在
4.获取 Stack 的长度
5.遍历 Stack
6.清空容器
7.Stack 泛型类
三、结束
一、概述
栈表示对象的简单后进先出 (LIFO) 非泛型集合。
Stack 和 List 一样是一种储存容器,它遵循先进后出的原则,能够存储任意类型,但并不能获取到指定的位置,只能存入和取出,取出元素后,Stack 内部的元素自动删除。
详细API参考:Stack 类 (System.Collections) | Microsoft Learn
二、基本的用法
1.入栈
入栈使用 push 方法,这里可以添加任意类型
using System;
using System.Collections;
namespace Stack_Test
{
internal class Program
{
static void Main(string[] args)
{
Stack stack = new Stack();
stack.Push("a");
stack.Push("b");
stack.Push(3);
stack.Push(4.5);
Console.ReadKey();
}
}
}
2.出栈
出栈常用的方法有两种,第一种:
Pop 方法
using System;
using System.Collections;
namespace Stack_Test
{
internal class Program
{
static void Main(string[] args)
{
Stack stack = new Stack();
stack.Push("a");
stack.Push("b");
stack.Push(3);
stack.Push(4.5);
var value = stack.Pop();
Console.WriteLine(value);
Console.WriteLine("count:" + stack.Count);
Console.ReadKey();
}
}
}
运行
这里可以看到,最后添加的 4.5 ,被最先取出来,取出来的同时,也从 stack 中删除了,此时的长度为3, 这就是概述中描述的 先进后出 原则,听起来有点难以理解,说通俗点就是,谁最后一个添加进来,谁就第一个出去。
第二种:
Peek 方法
using System;
using System.Collections;
namespace Stack_Test
{
internal class Program
{
static void Main(string[] args)
{
Stack stack = new Stack();
stack.Push("a");
stack.Push("b");
stack.Push(3);
stack.Push(4.5);
var value = stack.Peek();
Console.WriteLine(value);
Console.WriteLine("count:" + stack.Count);
Console.ReadKey();
}
}
}
运行
Peek 可以根据后进先出的原则取出一个元素,它并不会像 Pop 方法一样,把元素删除,但是也只能取一个元素,参考下面代码,重复的执行是没用的,要想按指定的顺序来取,还是得老老实实的用 Pop 方法。
using System;
using System.Collections;
namespace Stack_Test
{
internal class Program
{
static void Main(string[] args)
{
Stack stack = new Stack();
stack.Push("a");
stack.Push("b");
stack.Push(3);
stack.Push(4.5);
var value1 = stack.Peek();
var value2 = stack.Peek();
var value3 = stack.Peek();
Console.WriteLine(value1);
Console.WriteLine(value2);
Console.WriteLine(value3);
Console.ReadKey();
}
}
}
运行
3.判断元素是否存在
使用 Contains 方法可以判断元素是否存在,如下代码
using System;
using System.Collections;
namespace Stack_Test
{
internal class Program
{
static void Main(string[] args)
{
Stack stack = new Stack();
stack.Push("a");
stack.Push("b");
stack.Push(3);
stack.Push(4.5);
Console.WriteLine("是否存在:" + stack.Contains(4.5));
Console.ReadKey();
}
}
}
运行
4.获取 Stack 的长度
长度的获取和 List 一样,使用 Count 属性
using System;
using System.Collections;
namespace Stack_Test
{
internal class Program
{
static void Main(string[] args)
{
Stack stack = new Stack();
stack.Push("a");
stack.Push("b");
stack.Push(3);
stack.Push(4.5);
Console.WriteLine("长度:" + stack.Count);
Console.ReadKey();
}
}
}
运行
5.遍历 Stack
Stack 可以使用 foreach 遍历,并且不会移除元素
using System;
using System.Collections;
namespace Stack_Test
{
internal class Program
{
static void Main(string[] args)
{
Stack stack = new Stack();
stack.Push("a");
stack.Push("b");
stack.Push(3);
stack.Push(4.5);
foreach (var item in stack)
{
Console.WriteLine(item);
}
Console.WriteLine("长度:" + stack.Count);
Console.ReadKey();
}
}
}
运行
6.清空容器
清除 stack 使用 Clear 方法
using System;
using System.Collections;
namespace Stack_Test
{
internal class Program
{
static void Main(string[] args)
{
Stack stack = new Stack();
stack.Push("a");
stack.Push("b");
stack.Push(3);
stack.Push(4.5);
stack.Clear();
Console.WriteLine("长度:" + stack.Count);
Console.ReadKey();
}
}
}
运行
7.Stack 泛型类
Stack 泛型类 和 Stack 的用法其实没有什么不同,Stack 泛型类 只是在使用时多了一个约束,不能和 Stack 标准形式一样,可以添加任意类型到栈中,而是使用固定的元素类型
using System;
using System.Collections.Generic;
namespace Stack_Test
{
internal class Program
{
static void Main(string[] args)
{
Stack<string> stack = new Stack<string>();
//将元素入栈
stack.Push("a");
stack.Push("b");
stack.Push("c");
//栈的元素个数
int count = stack.Count;
//是否包含指定的元素
bool b = stack.Contains("a");
//Stack.Peek() 方法返回顶部的对象而不将其从堆栈中移除
string name = stack.Peek();
// Pop 把元素出栈,栈中就没有这个元素了
string s1 = stack.Pop();
Console.WriteLine(s1);
string s2 = stack.Pop();
Console.WriteLine(s2);
string s3 = stack.Pop();
Console.WriteLine(s3);
Console.ReadKey();
}
}
}
三、结束
最后,我们来看看 Stack 有那些特点:
先进后出,存在装箱拆箱,存储任意类型,无法遍历查看元素,无法获取指定位置元素,只能查看获取栈顶元素。
end