欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack)實例詳解

 更新時間:2015年11月27日 14:39:52   作者:Jimmy.Yang  
這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack),結(jié)合實例形式較為詳細的分析了堆棧的原理與C#實現(xiàn)堆棧功能的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下

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

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

相對前面學(xué)習(xí)過的順序表、鏈表不同的地方在于:Stack把所有操作限制在"只能在線性結(jié)構(gòu)的某一端"進行,而不能在中間插入或刪除元素。下面是示意圖:

從示意圖中可以看出,堆棧有二種實現(xiàn)方式:基于數(shù)組的順序堆棧實現(xiàn)、類似鏈表的鏈?zhǔn)蕉褩崿F(xiàn)

先抽象堆棧的接口IStack:

namespace 棧與隊列
{
  public interface IStack<T>
  {
    /// <summary>
    /// 返回堆棧的實際元素個數(shù)
    /// </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)的實現(xiàn):

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 //接口實現(xiàn)部分
    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(',');
    }    
  }
}

鏈?zhǔn)蕉褩?LinkStack)的實現(xiàn)

先定義節(jié)點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;//節(jié)點個數(shù)
    /// <summary>
    /// 頂部節(jié)點
    /// </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>已經(jīng)提供了堆棧的基本實現(xiàn),明白原理后,仍然推薦大家使用內(nèi)置的實現(xiàn)。

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

相關(guān)文章

  • c# 讀取XML文件的示例

    c# 讀取XML文件的示例

    這篇文章主要介紹了c# 讀取XML文件的示例,幫助大家更好的理解和使用c# 編程語言,感興趣的朋友可以了解下。
    2020-11-11
  • c# 給pdf添加數(shù)字簽名的步驟

    c# 給pdf添加數(shù)字簽名的步驟

    這篇文章主要介紹了c# 給pdf添加數(shù)字簽名的步驟,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • C#對稱加密(AES加密)每次生成的結(jié)果都不同的實現(xiàn)思路和代碼實例

    C#對稱加密(AES加密)每次生成的結(jié)果都不同的實現(xiàn)思路和代碼實例

    這篇文章主要介紹了C#對稱加密(AES加密)每次生成的結(jié)果都不同的實現(xiàn)思路和代碼實例,每次解密時從密文中截取前16位,這就是實現(xiàn)隨機的奧秘,本文同時給出了實現(xiàn)代碼,需要的朋友可以參考下
    2015-07-07
  • C# 語音功能的實現(xiàn)方法

    C# 語音功能的實現(xiàn)方法

    最近看了一些資料,是c#實現(xiàn)語音功能的?,F(xiàn)在就簡單的講一下怎么實現(xiàn)。
    2013-03-03
  • c#中l(wèi)ist.FindAll與for循環(huán)的性能對比總結(jié)

    c#中l(wèi)ist.FindAll與for循環(huán)的性能對比總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于c#中l(wèi)ist.FindAll與for循環(huán)的性能,文中通過詳細的示例代碼給大家介紹了這兩者之間的性能,對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • winform實現(xiàn)拖動文件到窗體上的方法

    winform實現(xiàn)拖動文件到窗體上的方法

    這篇文章主要介紹了winform實現(xiàn)拖動文件到窗體上的方法,以實例分析了C#中WinForm操作窗體及文件的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • C# CAD SelectionFilter下TypedValue數(shù)組使用方式

    C# CAD SelectionFilter下TypedValue數(shù)組使用方式

    這篇文章主要介紹了C# CAD SelectionFilter下TypedValue數(shù)組使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • C#實現(xiàn)Dictionary字典賦值的方法

    C#實現(xiàn)Dictionary字典賦值的方法

    本文主要介紹了C#實現(xiàn)Dictionary字典賦值的方法,如同java中的Hasttable,C#里面有Dictionary,可以實現(xiàn)很高效的鍵值對操作。感興趣的可以了解一下
    2021-05-05
  • C#使用foreach遍歷哈希表(hashtable)的方法

    C#使用foreach遍歷哈希表(hashtable)的方法

    這篇文章主要介紹了C#使用foreach遍歷哈希表(hashtable)的方法,是C#中foreach語句遍歷散列表的典型應(yīng)用,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • 使用Unity3D實現(xiàn)選中物體消融特效的方法詳解

    使用Unity3D實現(xiàn)選中物體消融特效的方法詳解

    消融特效中基Shader?Graph實現(xiàn)了消融特效,本文將基于?Shader?實現(xiàn)消融特效,當(dāng)前實現(xiàn)消融特效的方法主要有?Alpha?測試消融、clip(或?discard)消融,它們的本質(zhì)都是隨機丟棄一些片元,以實現(xiàn)消融效果,文中有詳細代碼示例,需要的朋友可以參考下
    2023-10-10

最新評論