數據結構-棧&鏈棧
阿新 • • 發佈:2017-12-23
先進後出 入棧 system tel read alt image summary esp
棧接口實現:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _002_棧 { /// <summary> /// 棧接口 /// </summary> /// <typeparam name="T"></typeparam> interface IStackDS<T> { int Count { get; } int GetLength(); bool isEmpty(); void Clear(); void Push(T item); T Pop(); T Peek(); } }
順序棧實現:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _002_棧 { /// <summary>/// 順序棧 /// </summary> /// <typeparam name="T"></typeparam> class SeqStack<T> : IStackDS<T> { private T[] data; //數組 private int top; //棧頂 public SeqStack(int size) { data = new T[size]; top = -1; }public SeqStack():this(10) { } public int Count //棧內數量 { get { return top + 1; } } /// <summary> /// 清空 /// </summary> public void Clear() { top = -1; } /// <summary> /// 獲得長度 /// </summary> /// <returns></returns> public int GetLength() { return Count; } /// <summary> /// 是否為空 /// </summary> /// <returns></returns> public bool isEmpty() { return Count == 0; } /// <summary> /// 取得棧頂數據,但不刪除 /// </summary> /// <returns></returns> public T Peek() { if (isEmpty()) { Console.WriteLine("棧為空,無法彈棧"); return default(T); } return data[top]; } /// <summary> /// 出棧,並且刪除數據 /// </summary> /// <returns></returns> public T Pop() { if (isEmpty()) { Console.WriteLine("棧為空,無法彈棧"); return default(T); } else { T temp = data[top]; top--; return temp; } } /// <summary> /// 入棧 /// </summary> /// <param name="item"></param> public void Push(T item) { if (IsFull()) { Console.WriteLine("棧已滿,無法入棧"); } else { data[top + 1] = item; top++; } } public bool IsFull() { if (top == data.Length) { return true; } return false; } } }
鏈棧
鏈節點:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _002_棧 { /// <summary> /// 鏈棧節點 /// </summary> /// <typeparam name="T"></typeparam> class Node<T> { private T data; private Node<T> next; public Node() { data = default(T); next = null; } public Node(T data) { this.data = data; next = null; } public Node(Node<T> next) { this.next = next; data = default(T); } public Node(T data,Node<T> next) { this.data = data; this.next = next; } public T Data { get { return data; } set { data = value; } } public Node<T> Next { get { return next; } set { next = value; } } } }
鏈棧實現:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _002_棧 { /// <summary> /// 鏈棧 /// </summary> /// <typeparam name="T"></typeparam> class LinkStack<T> : IStackDS<T> { private Node<T> top;//棧頂元素節點 private int count = 0;//棧中元素的個數 public LinkStack() { top = null; count = 0; } /// <summary> /// 取得棧中元素的個數 /// </summary> public int Count { get { return count; } } /// <summary> /// 清空棧中所有數據 /// </summary> public void Clear() { count = 0; top = null; } /// <summary> /// 取得棧中元素的個數 /// </summary> public int GetLength() { return count; } /// <summary> /// 是否為空棧 /// </summary> /// <returns></returns> public bool isEmpty() { return count == 0; } /// <summary> /// 取得棧頂元素 /// </summary> /// <returns></returns> public T Peek() { if (isEmpty()) { return default(T); } return top.Data; } /// <summary> /// 出棧 取得棧頂元素,然後刪除 /// </summary> /// <returns></returns> public T Pop() { if (isEmpty()) { return default(T); } else { //先進後出原則,直接把top弄出去 T data = top.Data; top = top.Next; count--; return data; } } /// <summary> /// 入棧 /// </summary> /// <param name="item"></param> public void Push(T item) { //把新添加的元素作為棧頂元素結點(棧頂) Node<T> newNode = new Node<T>(item); if (top == null) { top = newNode; } else { newNode.Next = top; top = newNode; } count++; } } }
棧應用
/// <summary> /// 十進制轉八進制 /// </summary> /// <param name="n"></param> public static void TenConversionEight(int n) { LinkStack<int> stack = new LinkStack<int>(); while (n>0) { stack.Push(n % 8); n = n/8; } while (!stack.isEmpty()) { Console.Write("{0}", stack.Pop()); } Console.WriteLine(""); }
數據結構-棧&鏈棧