数据结构C#版笔记--堆栈(Stack)
堆棧(Stack)最明顯的特征就是“先進(jìn)后出”,本質(zhì)上講堆棧也是一種線性結(jié)構(gòu),符合線性結(jié)構(gòu)的基本特點(diǎn):即每個(gè)節(jié)點(diǎn)有且只有一個(gè)前驅(qū)節(jié)點(diǎn)和一個(gè)后續(xù)節(jié)點(diǎn)。
相對(duì)前面學(xué)習(xí)過(guò)的順序表、鏈表不同的地方在于:Stack把所有操作限制在"只能在線性結(jié)構(gòu)的某一端"進(jìn)行,而不能在中間插入或刪除元素。下面是示意圖:
從示意圖中可以看出,堆棧有二種實(shí)現(xiàn)方式:基于數(shù)組的順序堆棧實(shí)現(xiàn)、類(lèi)似鏈表的鏈?zhǔn)蕉褩?shí)現(xiàn)
先抽象堆棧的接口IStack:
namespace 棧與隊(duì)列 {public interface IStack<T>{/// <summary>/// 返回堆棧的實(shí)際元素個(gè)數(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>/// 出棧:從堆棧頂取一個(gè)元素,并從堆棧中刪除/// </summary>/// <returns></returns>T Pop();/// <summary>/// 取堆棧頂部的元素(但不刪除)/// </summary>/// <returns></returns>T Peek();} }順序堆棧(SeqStack)的實(shí)現(xiàn):
using System; using System.Text;namespace 棧與隊(duì)列 {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 //接口實(shí)現(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];}#endregionpublic 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)的實(shí)現(xiàn)
先定義節(jié)點(diǎn)Node.cs
namespace 棧與隊(duì)列 {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 棧與隊(duì)列 {public class LinkStack<T>:IStack<T>{private Node<T> top;private int num;//節(jié)點(diǎn)個(gè)數(shù)/// <summary>/// 頂部節(jié)點(diǎn)/// </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();}} }測(cè)試代碼片段:
Console.WriteLine("順序堆棧測(cè)試開(kāi)始...");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("鏈堆棧測(cè)試開(kāi)始...");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)提供了堆棧的基本實(shí)現(xiàn),明白原理后,仍然推薦大家使用內(nèi)置的實(shí)現(xiàn)。
轉(zhuǎn)載于:https://www.cnblogs.com/yjmyzz/archive/2010/10/30/1865212.html
總結(jié)
以上是生活随笔為你收集整理的数据结构C#版笔记--堆栈(Stack)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ADO.NET Entity Frame
- 下一篇: C# 生成私钥和公钥