📅  最后修改于: 2023-12-03 14:40:32.853000             🧑  作者: Mango
在C#中,堆栈是一种数据结构,它是一种线性数据结构,使用LIFO(Last In First Out)的方式进行操作。它是一个很常见的数据结构,常用于程序的调用栈、表达式求值等场景。
在C#中,可以通过使用数组或链表来实现堆栈。对于数组实现堆栈,需要一个指针来指向栈顶元素的位置。对于链表实现堆栈,需要一个指针指向栈顶元素所在的节点。
以下是使用数组实现堆栈的示例代码:
public class Stack
{
private int[] data;
private int top;
public Stack(int capacity)
{
data = new int[capacity];
top = -1;
}
public void Push(int value)
{
if (top == data.Length - 1)
{
throw new StackOverflowException();
}
top++;
data[top] = value;
}
public int Pop()
{
if (top == -1)
{
throw new InvalidOperationException();
}
int value = data[top];
top--;
return value;
}
public int Peek()
{
if (top == -1)
{
throw new InvalidOperationException();
}
return data[top];
}
public bool IsEmpty()
{
return top == -1;
}
}
在上面的示例代码中,使用数组来存储数据,使用top变量来表示栈顶元素的位置。Push方法用于向堆栈中添加一个元素,如果堆栈已满(即top等于数组的长度减一),则抛出StackOverflowException异常;Pop方法用于从堆栈中取出栈顶元素,并将top减一,如果堆栈为空(即top等于负一),则抛出InvalidOperationException异常;Peek方法用于获取栈顶元素的值,但不从堆栈中移除它,如果堆栈为空(即top等于负一),则抛出InvalidOperationException异常。
以下是使用链表实现堆栈的示例代码:
public class Node
{
public int Value { get; set; }
public Node Next { get; set; }
}
public class Stack
{
private Node top;
public void Push(int value)
{
Node node = new Node();
node.Value = value;
node.Next = top;
top = node;
}
public int Pop()
{
if (top == null)
{
throw new InvalidOperationException();
}
int value = top.Value;
top = top.Next;
return value;
}
public int Peek()
{
if (top == null)
{
throw new InvalidOperationException();
}
return top.Value;
}
public bool IsEmpty()
{
return top == null;
}
}
在上面的示例代码中,使用链表来存储数据,使用top变量来指向栈顶元素所在的节点。Push方法用于向堆栈中添加一个元素,该元素将成为新的栈顶元素;Pop方法用于从堆栈中取出栈顶元素,并将top指向栈顶元素的下一个节点;Peek方法用于获取栈顶元素的值,但不从堆栈中移除它。
堆栈常用于程序的调用栈、表达式求值以及括号匹配等场景。以下是使用堆栈实现括号匹配的示例代码:
public static bool IsBalanced(string input)
{
Stack<char> stack = new Stack<char>();
foreach (char c in input)
{
if (c == '(' || c == '[' || c == '{')
{
stack.Push(c);
}
else if (c == ')' || c == ']' || c == '}')
{
if (stack.Count == 0)
{
return false;
}
char last = stack.Pop();
if (last == '(' && c != ')' || last == '[' && c != ']' || last == '{' && c != '}')
{
return false;
}
}
}
return stack.Count == 0;
}
在上面的示例代码中,使用堆栈来实现括号匹配。遍历输入字符串中的每个字符,如果字符是左括号(即“(”、“[”或“{”),则将其压入堆栈;如果字符是右括号,则从堆栈中弹出一个左括号,并判断左右括号是否匹配。如果弹出的左括号不是该右括号的配对符,则返回false。最后,如果堆栈不为空,则说明左括号数量多于右括号数量,返回false。如果堆栈为空,则说明左括号数量等于右括号数量,返回true。
堆栈是C#中常用的数据结构之一,可以使用数组或链表来实现。堆栈可以用于程序的调用栈、表达式求值以及括号匹配等场景。掌握堆栈的实现和应用,有助于提高程序员的编程能力。