C# 資料結構 棧
阿新 • • 發佈:2019-01-14
資料結構學習之路-第三章:棧的應用
https://blog.csdn.net/libin1105/article/details/48295439
C# 棧的應用
https://blog.csdn.net/qq_42606051/article/details/81080385
在一個棧的輸入序列為12345 下面哪個不可能是棧的輸出序列?
A. 23415 B.54132 C.23145 D.15432
23415------>1進棧,2進棧,2出棧,3進棧,3出棧,4進棧,4出棧,1出棧,5進棧,5出棧
23145------>1進棧,2進棧,2出棧,3進棧,3出棧,1出棧,4進棧,4出棧,5進棧,5出棧
15432------>1進棧,1出棧,2進棧,2進棧,4進棧,5進棧,5出棧,4出棧,3出棧,2出棧
54132不可能。
何為棧
棧(stack):是限定僅在表尾進行插入和刪除操作的線性表
棧(Stack)是操作限定在表的尾端進行的線性表。表尾由於要進行插入、刪除等操作,所以,它具有特殊的含義,把表尾稱為棧頂( Top),另一端是固定的,叫棧底( Bottom)。當棧中沒有資料元素時叫空棧(Empty Stack)。 棧的操作示意圖如圖所示。
操作
public interface IStack<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_棧 { 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; } } public int GetLength() { return Count; } public bool IsEmpty() { return Count == 0; } public void Clear() { top = -1; } public void Push(T item) { data[top + 1] = item; top++; } public T Pop() { T temp = data[top]; top--; return temp; } public T Peek() { return data[top]; } } }
鏈棧
結點
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(T data, Node<T> next)
{
this.data = data;
this.next = next;
}
public Node(Node<T> next)
{
this.next = next;
data = default(T);
}
//屬性
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_棧 {
class LinkStack<T>:IStackDS<T>
{
private Node<T> top;// 棧頂元素結點
private int count = 0;//棧中元素的個數
/// <summary>
/// 取得棧中元素的個數
/// </summary>
public int Count
{
get { return count; }
}
/// <summary>
/// 取得棧中元素的個數
/// </summary>
/// <returns></returns>
public int GetLength()
{
return count;
}
/// <summary>
/// 判斷棧中是否有資料
/// </summary>
/// <returns></returns>
public bool IsEmpty()
{
return count == 0;
}
/// <summary>
/// 清空棧中所有的資料
/// </summary>
public void Clear()
{
count = 0;
top = null;
}
/// <summary>
/// 入棧
/// </summary>
/// <param name="item"></param>
public void Push(T item)
{
//把新新增的元素作為頭結點(棧頂)
Node<T> newNode = new Node<T>(item);
newNode.Next = top;
top = newNode;
count++;
}
/// <summary>
/// 出棧 取得棧頂元素,然後刪除
/// </summary>
/// <returns></returns>
public T Pop()
{
T data = top.Data;
top = top.Next;
count--;
return data;
}
/// <summary>
/// 取得棧頂中的資料,不刪除棧頂
/// </summary>
/// <returns></returns>
public T Peek()
{
return top.Data;
}
}
}
應用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _002_棧 {
class Program {
static void Main(string[] args) {
//1,使用BCL中的Stack<T>
//Stack<char> stack = new Stack<char>();
//2,使用我們自己的順序棧
//IStackDS<char> stack = new SeqStack<char>(30);
//3,使用我們自己的鏈棧
IStackDS<char> stack = new LinkStack<char>();
stack.Push('a');
stack.Push('b');
stack.Push('c');//棧頂資料
Console.WriteLine("push a b c之後的資料個數為:"+stack.Count);
char temp = stack.Pop();//取得棧頂資料,並把棧頂的資料刪除
Console.WriteLine("pop 之後得到的資料是:"+temp);
Console.WriteLine("pop 之後棧中資料的個數:"+stack.Count);
char temp2 = stack.Peek();//取得棧頂的資料,不刪除
Console.WriteLine("peek 之後得到的資料是:" + temp2);
Console.WriteLine("peek 之後棧中資料的個數:" + stack.Count);
stack.Clear();
Console.WriteLine("clear 之後棧中資料的個數:" + stack.Count);
//Console.WriteLine("空棧的時候,取得棧頂的值:"+stack.Peek());// 出現異常
//當空棧的時候,不要進行peek或者pop操作 ,否則會出現異常
Console.ReadKey();
}
}
}