国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#數據結構之堆棧(Stack)實例詳解

2020-01-24 01:21:28
字體:
來源:轉載
供稿:網友

本文實例講述了C#數據結構之堆棧(Stack)。分享給大家供大家參考,具體如下:

堆棧(Stack)最明顯的特征就是“先進后出”,本質上講堆棧也是一種線性結構,符合線性結構的基本特點:即每個節點有且只有一個前驅節點和一個后續節點。

相對前面學習過的順序表鏈表不同的地方在于: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(',');    }      }}

鏈式堆棧(LinkStack)的實現

先定義節點Node.cs

namespace 棧與隊列{  public class Node<T>  {    private T data;    private Node<T> next;    public Node(T data, Node<T> next)     {      this.data = data;      this.next = next;    }    public Node(Node<T> next)     {      this.next = next;      this.data = default(T);    }    public Node(T data)     {      this.data = data;      this.next = null;    }    public Node()     {      this.data = default(T);      this.next = null;    }    public T Data {      get { return this.data; }      set { this.data = value; }    }    public Node<T> Next     {      get { return next; }      set { next = value; }    }  }}

下面是LinkStack.cs

using System;using System.Text;namespace 棧與隊列{  public class LinkStack<T>:IStack<T>  {    private Node<T> top;    private int num;//節點個數    /// <summary>    /// 頂部節點    /// </summary>    public Node<T> Top     {      get { return top; }      set { top = value; }    }    public LinkStack()     {      top = null;      num = 0;    }    public int Count()     {      return num;    }    public void Clear()     {      top = null;      num = 0;    }    public bool IsEmpty()     {      if (top == null && num == 0)      {        return true;      }      else      {        return false;      }    }    public void Push(T item)     {      Node<T> q = new Node<T>(item);      if (top == null)      {        top = q;      }      else      {        q.Next = top;        top = q;      }      num++;    }    public T Pop()     {      if (IsEmpty())       {        Console.WriteLine("Stack is empty!");        return default(T);      }      Node<T> p = top;      top = top.Next;      num--;      return p.Data;    }    public T Peek()     {      if (IsEmpty())       {        Console.WriteLine("Stack is empty!");        return default(T);      }      return top.Data;    }    public override string ToString()    {      StringBuilder sb = new StringBuilder();      if (top != null)       {        sb.Append(top.Data.ToString() + ",");        Node<T> p = top;        while (p.Next != null)        {                    sb.Append(p.Next.Data.ToString()+ ",");          p = p.Next;        }      }      return sb.ToString();    }  }}

測試代碼片段:

Console.WriteLine("順序堆棧測試開始...");SeqStack<int> seqStack = new SeqStack<int>(10);seqStack.Push(1);seqStack.Push(2);seqStack.Push(3);Console.WriteLine(seqStack);Console.WriteLine(seqStack.Peek());Console.WriteLine(seqStack);Console.WriteLine(seqStack.Pop());Console.WriteLine(seqStack);Console.WriteLine("鏈堆棧測試開始...");LinkStack<int> linkStack = new LinkStack<int>();linkStack.Push(1);linkStack.Push(2);linkStack.Push(3);Console.WriteLine(linkStack);Console.WriteLine(linkStack.Peek());Console.WriteLine(linkStack);Console.WriteLine(linkStack.Pop());Console.WriteLine(linkStack);Console.ReadLine();

注: .Net中System.Collections.Generic.Stack<T>已經提供了堆棧的基本實現,明白原理后,仍然推薦大家使用內置的實現

希望本文所述對大家C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吐鲁番市| 顺平县| 古浪县| 杭锦后旗| 黄山市| 介休市| 府谷县| 巴东县| 天镇县| 娱乐| 德安县| 安乡县| 黔西县| 石家庄市| 林口县| 伊金霍洛旗| 垫江县| 湘潭县| 闽侯县| 林周县| 响水县| 平潭县| 新蔡县| 华阴市| 开原市| 樟树市| 惠州市| 若尔盖县| 清镇市| 沙雅县| 敖汉旗| 全椒县| 体育| 凤城市| 阿拉善右旗| 藁城市| 汝州市| 嘉义县| 巴中市| 鹿泉市| 平凉市|