33 阅读1分钟

What is Stack?

栈(stack)是一种线性数据结构,其中新元素的插入和现有元素的删除发生在表示为堆栈顶部的同一端。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头端称为栈底(bottom)。不含元素的空表称为空栈。

要实现堆栈,需要维护指向堆栈顶部的指针,这是要插入的最后一个元素,因为我们只能访问堆栈顶部的元素。

Basic Operations on Stack

为了在堆栈中进行操作,需要向我们提供某些操作。

  • Push 将元素插入到堆栈中

  • Pop 从堆栈中删除元素

  • Top 返回堆栈的 top 元素。

  • Size 返回堆栈的大小。

Implementing Stack using Arrays

初始化

public class ArrayStack
{
    private int[] element;
    private int top;
    private int max;
    public ArrayStack(int size)
    {
        element = new int[size];
        top = -1;
        max = size;
    }
}

入栈

public bool Push(int item)
{
    if (top == max - 1)
        return false;
    element[++top] = item;
    return true;
}

出栈

public int Pop()
{
    if (top == -1)
        throw new StackEmptyException("Stack is Empty");
    return element[top--];
}

取栈顶元素

public int Peek()
{
    if (top == -1)
        throw new StackEmptyException("Stack is Empty");
    return element[top];
}

输出栈内元素

public void PrintStack()
{
    if (top == -1)
        throw new StackEmptyException("Stack is Empty");
    for (int i = 0; i <= top; i++)
        Console.WriteLine(element[i]);
}

注意:这里的top始终指向栈顶元素,并不是指向栈顶元素上一个位置,实现方式都一样。

Tests

创建单元测试

[TestClass]
public class ArrayStackTests
{
    private readonly ArrayStack _stack;

    public ArrayStackTests()
    {
        _stack = new(5);
    }

    [TestMethod]
    public void TestPush()
    {
        Assert.IsTrue(_stack.Push(1));
    }
    [TestMethod]
    public void TestPop()
    {
        _stack.Pop();
    }
    [TestMethod]
    [ExpectedException(typeof(StackEmptyException))]
    public void TestPeek()
    {
        _stack.Peek();
    }
}

执行测试命令

dotnet test --filter ClassName=Algorithm.Tests.ArrayStackTests

输出

失败!  - 失败:     1,通过:     2,已跳过:     0,总计:     3,持续时间: 20 ms - Algorithm.Tests.dll (net7.0)