日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

数据结构C#版笔记--堆栈(Stack)

發(fā)布時(shí)間:2023/12/9 C# 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构C#版笔记--堆栈(Stack) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

堆棧(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。