📜  C#堆栈(1)

📅  最后修改于: 2023-12-03 14:40:32.853000             🧑  作者: Mango

C#堆栈介绍

简介

在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#中常用的数据结构之一,可以使用数组或链表来实现。堆栈可以用于程序的调用栈、表达式求值以及括号匹配等场景。掌握堆栈的实现和应用,有助于提高程序员的编程能力。