OneBigLoser
OneBigLoser
发布于 2024-07-15 / 10 阅读
0
0

Stack的解释

Stack(栈)是一种后进先出(LIFO, Last In First Out)的数据结构。这意味着最后被添加到栈中的元素会是第一个被移除的。栈提供了三个主要的操作:push(压入),pop(弹出),和 peek(查看栈顶元素但不移除)。

用途及在游戏开发中的应用

栈的用途非常广泛,包括:

  • 函数调用:在大多数编程语言中,函数调用的记录是通过栈来管理的。

  • 撤销操作:在软件工具中(如文本编辑器),撤销最近的操作通常使用栈实现。

  • 表达式求值:用于计算后缀表达式(逆波兰表达式)等。

在游戏开发中,栈的用途包括:

  • 游戏状态管理:游戏的场景或状态可以使用栈管理,允许玩家从当前状态返回到上一个状态。

  • 路径跟踪:在需要追踪路径(如迷宫游戏中)时,路径的选择可以压入栈中,回退时可以从栈中弹出。

基本概念和语法规则

在C#中,栈是通过 Stack<T> 类实现的,属于 System.Collections.Generic 命名空间。T 表示栈中存储的数据类型。

如何声明

首先,需要引入命名空间:

using System.Collections.Generic;

然后,可以声明和实例化一个栈:

Stack<int> stack = new Stack<int>();

常用操作

  • Push:将元素添加到栈顶。

  • Pop:移除并返回栈顶元素。

  • Peek:返回栈顶元素但不移除。

  • Count:获取栈中的元素数量。

示例代码

Stack<string> books = new Stack<string>();
books.Push("Harry Potter");
books.Push("Game of Thrones");
books.Push("The Hobbit");

// 查看栈顶元素
Console.WriteLine("Top book: " + books.Peek());

// 弹出栈顶元素
Console.WriteLine("Popped: " + books.Pop());

// 再次查看栈顶元素
Console.WriteLine("Top book now: " + books.Peek());

// 输出栈中剩余的书籍数量
Console.WriteLine("Books count: " + books.Count);


//代码2
using System;
using System.Collections;
public class SamplesStack  {

   public static void Main()  {

      // Creates and initializes a new Stack.
      Stack myStack = new Stack();
      myStack.Push("Hello");
      myStack.Push("World");
      myStack.Push("!");

      // Displays the properties and values of the Stack.
      Console.WriteLine( "myStack" );
      Console.WriteLine( "\tCount:    {0}", myStack.Count );
      Console.Write( "\tValues:" );
      PrintValues( myStack );
   }

   public static void PrintValues( IEnumerable myCollection )  {
      foreach ( Object obj in myCollection )
         Console.Write( "    {0}", obj );
      Console.WriteLine();
   }
}


/*
This code produces the following output.

myStack
    Count:    3
    Values:    !    World    Hello
*/

优点和缺点

优点

  • 简单高效:栈的操作(push/pop)通常是常数时间复杂度O(1)。

  • 自然的撤销机制:适合需要最后操作优先撤销的场景。

缺点

  • 有限的访问:只能访问栈顶元素,不适合需要随机访问的场景。

练习题目

基础题目

  1. 创建一个栈,并使用它来存储一系列数字,然后打印它们出来,确保数字的输出顺序与添加顺序相反。

  2. 利用栈实现字符串的反转:输入一个字符串,使用栈操作,将其反转后输出。

更有难度的题目

  1. 检查括号匹配:给定一个包含字符 '('、')'、'{'、'}'、'[' 和 ']' 的字符串,使用栈来判断字符串中的括号是否有效匹配。

  2. 后缀表达式求值:编写一个程序,使用栈来评估后缀表达式(例如,输入 "6 5 2 3 + 8 + 3 + " 应该输出结果)。


评论