算法系列15天速成 第十天 棧
一: 概念
棧,同樣是一種特殊的線性表,是一種Last In First Out(LIFO)的形式,現(xiàn)實(shí)中有很多這樣的例子,
比如:食堂中的一疊盤(pán)子,我們只能從頂端一個(gè)一個(gè)的取。
二:存儲(chǔ)結(jié)構(gòu)
”?!安幌瘛标?duì)列“,需要兩個(gè)指針來(lái)維護(hù),棧只需要一個(gè)指針就夠了,這得益于棧是一種一端受限的線性表。
這里同樣用”順序結(jié)構(gòu)“來(lái)存儲(chǔ)這個(gè)”?!?,top指針指向棧頂,所有的操作只能在top處。
代碼段:
#region 棧的數(shù)據(jù)結(jié)構(gòu)
/// <summary>
/// 棧的數(shù)據(jù)結(jié)構(gòu)
/// </summary>
public class SeqStack<T>
{
public T[] data;
/// <summary>
/// 棧頂指針
/// </summary>
public int top = -1;
public SeqStack(int lenth)
{
data = new T[lenth];
}
}
#endregion
三:常用操作
棧的操作有:①初始化棧,②入棧,③出棧,④獲取棧頂。
1: 初始化棧
這個(gè)還是比較簡(jiǎn)單的,初始化棧時(shí),設(shè)置默認(rèn)top指針為-1,這個(gè)就不用圖來(lái)展示了。
代碼段:
#region 棧的初始化操作
/// <summary>
/// 棧的初始化操作
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public SeqStack<T> SeqStackInit<T>(int length)
{
SeqStack<T> seqStack = new SeqStack<T>(length);
seqStack.top = -1;
return seqStack;
}
#endregion
2:入棧
這個(gè)操作主要就是做兩件事情:① 將元素從棧頂壓入,② top指針自增。
代碼段:
#region 入棧
/// <summary>
/// 入棧
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seqStack"></param>
/// <param name="data"></param>
public void SeqStackPush<T>(SeqStack<T> seqStack, T data)
{
if (SeqStackIsFull(seqStack))
throw new Exception("不好意思,棧溢出");
seqStack.data[++seqStack.top] = data;
}
#endregion
3:出棧
同樣跟“入?!鳖?lèi)似,需要做兩件事情,①干掉top處的元素,②top指針自減。
代碼段
#region 出棧
/// <summary>
/// 出棧
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seqStack"></param>
/// <returns></returns>
public T SeqStackPop<T>(SeqStack<T> seqStack)
{
if (SeqStackIsEmpty(seqStack))
throw new Exception("嗚嗚,棧已空");
seqStack.data[seqStack.top] = default(T);
return seqStack.data[--seqStack.top];
}
#endregion
4:獲取棧頂元素
這個(gè)很簡(jiǎn)單,跟“出?!蔽ㄒ徊煌氖遣黄茐臈m斣?,只是翻出來(lái)看看而已。
代碼段
#region 獲取棧頂
/// <summary>
/// 獲取棧頂
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seqStack"></param>
/// <returns></returns>
public T SeqStackPeek<T>(SeqStack<T> seqStack)
{
if (SeqStackIsEmpty(seqStack))
throw new Exception("棧已空");
return seqStack.data[seqStack.top];
}
#endregion
總的運(yùn)行代碼如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SeqStack
{
class Program
{
static void Main(string[] args)
{
SeqStackClass stackManager = new SeqStackClass();
SeqStack<Student> seqStack = stackManager.SeqStackInit<Student>(10);
Console.WriteLine("******************** 壓入ID=1,ID=2,ID=3的元素 ***********************\n");
//壓入ID=1,ID=2,ID=3的元素
stackManager.SeqStackPush(seqStack, new Student() { ID = 1, Name = "一線碼農(nóng)", Age = 23 });
stackManager.SeqStackPush(seqStack, new Student() { ID = 2, Name = "huangxincheng520", Age = 23 });
stackManager.SeqStackPush(seqStack, new Student() { ID = 3, Name = "51cto", Age = 23 });
Console.WriteLine(".... 壓入成功,當(dāng)前棧中元素有:" + stackManager.SeqStackLen(seqStack) + "個(gè)");
Console.WriteLine("\n****************** 查看棧頂元素 ********************");
var result = stackManager.SeqStackPeek(seqStack);
Console.WriteLine("棧頂元素為:ID=" + result.ID + ",Name=" + result.Name + ",Age=" + result.Age);
Console.WriteLine("\n******************** 彈出棧頂元素 ***********************");
stackManager.SeqStackPop(seqStack);
Console.WriteLine("\n****************** 查看棧中的元素 ********************");
for (int i = 0; i < stackManager.SeqStackLen(seqStack); i++)
{
Console.WriteLine("棧頂元素為:ID=" + seqStack.data[i].ID + ",Name=" + seqStack.data[i].Name + ",Age=" + seqStack.data[i].Age);
}
Console.Read();
}
}
#region 學(xué)生數(shù)據(jù)實(shí)體
/// <summary>
/// 學(xué)生數(shù)據(jù)實(shí)體
/// </summary>
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
#endregion
#region 棧的數(shù)據(jù)結(jié)構(gòu)
/// <summary>
/// 棧的數(shù)據(jù)結(jié)構(gòu)
/// </summary>
public class SeqStack<T>
{
public T[] data;
/// <summary>
/// 棧頂指針
/// </summary>
public int top = -1;
public SeqStack(int lenth)
{
data = new T[lenth];
}
}
#endregion
public class SeqStackClass
{
#region 棧的初始化操作
/// <summary>
/// 棧的初始化操作
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public SeqStack<T> SeqStackInit<T>(int length)
{
SeqStack<T> seqStack = new SeqStack<T>(length);
seqStack.top = -1;
return seqStack;
}
#endregion
#region 判斷棧是否為空
/// <summary>
/// 判斷棧是否為空
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seqStack"></param>
/// <returns></returns>
public bool SeqStackIsEmpty<T>(SeqStack<T> seqStack)
{
return seqStack.top == -1;
}
#endregion
#region 清空棧
/// <summary>
/// 清空棧
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seqStack"></param>
public void SeqStackClear<T>(SeqStack<T> seqStack)
{
seqStack.top = -1;
}
#endregion
#region 棧是否已滿(mǎn)
/// <summary>
/// 棧是否已滿(mǎn)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seqStack"></param>
public bool SeqStackIsFull<T>(SeqStack<T> seqStack)
{
return seqStack.top == seqStack.data.Length;
}
#endregion
#region 入棧
/// <summary>
/// 入棧
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seqStack"></param>
/// <param name="data"></param>
public void SeqStackPush<T>(SeqStack<T> seqStack, T data)
{
if (SeqStackIsFull(seqStack))
throw new Exception("不好意思,棧溢出");
seqStack.data[++seqStack.top] = data;
}
#endregion
#region 出棧
/// <summary>
/// 出棧
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seqStack"></param>
/// <returns></returns>
public T SeqStackPop<T>(SeqStack<T> seqStack)
{
if (SeqStackIsEmpty(seqStack))
throw new Exception("嗚嗚,棧已空");
seqStack.data[seqStack.top] = default(T);
return seqStack.data[--seqStack.top];
}
#endregion
#region 獲取棧頂
/// <summary>
/// 獲取棧頂
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seqStack"></param>
/// <returns></returns>
public T SeqStackPeek<T>(SeqStack<T> seqStack)
{
if (SeqStackIsEmpty(seqStack))
throw new Exception("棧已空");
return seqStack.data[seqStack.top];
}
#endregion
#region 獲取棧中元素個(gè)數(shù)
/// <summary>
/// 獲取棧中元素個(gè)數(shù)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seqStack"></param>
/// <returns></returns>
public int SeqStackLen<T>(SeqStack<T> seqStack)
{
return seqStack.top + 1;
}
#endregion
}
}
- 算法系列15天速成 第十四天 圖【上】
- 算法系列15天速成——第十三天 樹(shù)操作【下】
- 算法系列15天速成 第十二天 樹(shù)操作【中】
- 算法系列15天速成 第十一天 樹(shù)操作(上)
- 算法系列15天速成 第八天 線性表【下】
- 算法系列15天速成 第九天 隊(duì)列
- 算法系列15天速成 第七天 線性表【上】
- 算法系列15天速成 第六天 五大經(jīng)典查找【下】
- 算法系列15天速成 第五天 五大經(jīng)典查找【中】
- 算法系列15天速成 第四天 五大經(jīng)典查找【上】
- 算法系列15天速成 第三天 七大經(jīng)典排序【下】
- 算法系列15天速成 第二天 七大經(jīng)典排序【中】
- 算法系列15天速成 第一天 七大經(jīng)典排序【上】
- 算法系列15天速成——第十五天 圖【下】(大結(jié)局)
相關(guān)文章
IntelliJ IDEA2020.3 新特性(小結(jié))
這篇文章主要介紹了IntelliJ IDEA 2020.3 新特性,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-12-12udp協(xié)議簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了udp協(xié)議簡(jiǎn)介的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07