Loading...
墨滴

莫激

2021/12/09  阅读:46  主题:默认主题

Stack(栈)

Stack(栈)

Stack的本质

  • Stack(栈)是一个C#为我们封装好的类,它的本质也是一个Object类型,只是封装了特殊的存储规则

    ###栈是先进后出

    stack是栈存储容器,栈是一种先进后出的数据结构,先存入的数据后获取,后存入的数据先获取,如下图所示

    1639035246075
    1639035246075

申明

  • 需要引用命名空间System.Collections

    Stack stack = new Stack();

增取查改

增(压栈)

  • stack.Push();

因为stack是一种特殊的数据存储结构,因为添加数据时候也可以叫做压栈,想象这是一个只有向上出口的箱子,当我们往里面放东西或者取东西的时候都只能从上方取

1639037783864
1639037783864
stack.Push(1); //先放进去的就在最下层,以此类推
stack.Push("123");
stack.Push(true);
stack.Push(1.2f);
stack.Push(new Test());
//当这些数据压栈完后效果如上图

取(弹栈)

  • 在栈中不存在删除的概念,只有取的概念stack.Pop();
Object v = stack.Pop();
Console.WriteLine(v); //最终取出来的值是Test
v = stack.Pop();
Console.WriteLine(v); //这次取出来的值是1.2f;

查有如下两种方式,一种是查栈顶,一种的查栈中是否包含哪个数

  • 栈无法查看指定位置的元素,只能查看栈顶的内容比如stack[0],这样是错误的。

v = stack.Peek();==这里需要注意,它没有没有把它弹出来,他只是取出来看一看,没有真正的把它从这个容器中移除==,比如下面的例子

//因为上面弹栈的时候,已经把Test和1.2f弹出来了,所以现在栈容器里最顶层的是true
v = stack.Peek();
Console.WriteLine(v); //结果是true
v = stack.Peek();
Console.WriteLine(v); //结果也是true
  • 查看元素是否存在于栈中

    stack.Contains();返回值是布尔类型的

因为栈的特殊存储结构,所以是没有办法像数组一样用索引器去获取的,比如这样array[i]

所以栈是无法改变其中的元素,只能用压(存)和弹(取),真的要改,只有清空后stack.Clear();,再重新压栈

1639037875787
1639037875787
stack.Clear();
stack.Push("1");
stack.Push(2);
stack.Push("哈哈哈");

遍历

  • 长度stack.Count;

  • 用foreach遍历,而且遍历出来的顺序,也是从栈顶到栈底的

    ==*用foreach遍历而不用for循环遍历,是因为栈里面是没有提供索引器通过中括号去访问的接口的,所以是没有办法用for循环去遍历的==

    foreach(object item in stack)
    {
        Console.WriteLine(item); 
    }
    这也证实了栈**先进后出的**存储结构
  • 另一种遍历方式,将栈转换为object类型的数组,这也就可以用for循环去遍历了

    object[] array = stack.Toarray();
    for(int i = 0; i<array.Length; i++)
    {
        Console.WriteLine(array[i]);
    }
  • 循环弹栈

    while(stack.Count>0)
    {
        Object o = stack.Pop();
        Console.WriteLine(o);
    }

装箱拆箱

  • 由于用万物之父来存储数据,自然存在装箱和拆箱
  • 当往其中进行值类型存储时就是在装箱,例如stack.Push(1)其实就是将值类型用引用类型存储,就是将栈内存转移到堆内存中
  • 当将值类型对象取出来转换使用时,就存在拆箱。这是将引用类型中的值类型提取出来,堆内存会迁移到栈内存中

莫激

2021/12/09  阅读:46  主题:默认主题

作者介绍

莫激