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)。
自然的撤销机制:适合需要最后操作优先撤销的场景。
缺点:
有限的访问:只能访问栈顶元素,不适合需要随机访问的场景。
练习题目
基础题目
创建一个栈,并使用它来存储一系列数字,然后打印它们出来,确保数字的输出顺序与添加顺序相反。
利用栈实现字符串的反转:输入一个字符串,使用栈操作,将其反转后输出。
更有难度的题目
检查括号匹配:给定一个包含字符 '('、')'、'{'、'}'、'[' 和 ']' 的字符串,使用栈来判断字符串中的括号是否有效匹配。
后缀表达式求值:编写一个程序,使用栈来评估后缀表达式(例如,输入 "6 5 2 3 + 8 + 3 + " 应该输出结果)。