C# 栈(Stack)

目录

一、概述

二、基本的用法

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 有那些特点:

先进后出,存在装箱拆箱,存储任意类型,无法使用 for 循环遍历查看元素,无法获取指定位置元素,只能查看获取栈顶元素。

end

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊思宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值