C#数据结构之堆栈(Stack)实例详解

2019-12-30 11:22:56于丽
易采站长站为您分析C#数据结构之堆栈(Stack),结合实例形式较为详细的分析了堆栈的原理与C#实现堆栈功能的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下  

本文实例讲述了C#数据结构之堆栈(Stack)。,具体如下:

堆栈(Stack)最明显的特征就是“先进后出”,本质上讲堆栈也是一种线性结构,符合线性结构的基本特点:即每个节点有且只有一个前驱节点和一个后续节点。

相对前面学习过的顺序表、链表不同的地方在于:Stack把所有操作限制在"只能在线性结构的某一端"进行,而不能在中间插入或删除元素。下面是示意图:

C#数据结构之堆栈(Stack)实例详解

从示意图中可以看出,堆栈有二种实现方式:基于数组的顺序堆栈实现、类似链表的链式堆栈实现

先抽象堆栈的接口IStack:


namespace 栈与队列
{
  public interface IStack<T>
  {
    /// <summary>
    /// 返回堆栈的实际元素个数
    /// </summary>
    /// <returns></returns>
    int Count();
    /// <summary>
    /// 判断堆栈是否为空
    /// </summary>
    /// <returns></returns>
    bool IsEmpty();
    /// <summary>
    /// 清空堆栈里的元素
    /// </summary>
    void Clear();
    /// <summary>
    /// 入栈:将元素压入堆栈中
    /// </summary>
    /// <param name="item"></param>
    void Push(T item);
    /// <summary>
    /// 出栈:从堆栈顶取一个元素,并从堆栈中删除
    /// </summary>
    /// <returns></returns>
    T Pop();
    /// <summary>
    /// 取堆栈顶部的元素(但不删除)
    /// </summary>
    /// <returns></returns>
    T Peek();
  }
}

顺序堆栈(SeqStack)的实现:


using System;
using System.Text;
namespace 栈与队列
{
  public class SeqStack<T>:IStack<T>
  {
    private int maxsize;
    private T[] data;
    private int top;    
    public SeqStack(int size) 
    {
      data = new T[size];
      maxsize = size;
      top = -1;
    }
    #region //接口实现部分
    public int Count() 
    {
      return top + 1;
    }
    public void Clear() 
    {
      top = -1;
    }
    public bool IsEmpty() 
    {
      return top == -1;
    }
    public void Push(T item)
    {
      if (IsFull())
      {
        Console.WriteLine("Stack is full");
        return;
      }
      data[++top] = item;
    }
    public T Pop()
    {
      T tmp = default(T);
      if (IsEmpty())
      {
        Console.WriteLine("Stack is empty");
        return tmp;
      }
      tmp = data[top];
      top--;
      return tmp;
    }
    public T Peek()
    {
      if (IsEmpty())
      {
        Console.WriteLine("Stack is empty!");
        return default(T);
      }
      return data[top];
    }
    #endregion
    public bool IsFull() 
    {
      return top == maxsize - 1;
    }
    public override string ToString()
    {
      StringBuilder sb = new StringBuilder();
      for (int i = top;i>=0;i--)
      {
        sb.Append(data[i] + ",");
      }
      return sb.ToString().Trim(',');
    }    
  }
}