栈,同样是一种特殊的线性表,是一种Last In First Out(LIFO)的形式,现实中有很多这样的例子,
比如:食堂中的一叠盘子,我们只能从顶端一个一个的取。
二:存储结构
”栈“不像”队列“,需要两个指针来维护,栈只需要一个指针就够了,这得益于栈是一种一端受限的线性表。
这里同样用”顺序结构“来存储这个”栈“,top指针指向栈顶,所有的操作只能在top处。
代码段:
复制代码 代码如下: #region 栈的数据结构 /// <summary> /// 栈的数据结构 /// </summary> public class SeqStack<T> { public T[] data;
/// <summary> /// 栈顶指针 /// </summary> public int top = -1;
public SeqStack(int lenth) { data = new T[lenth]; } } #endregion
三:常用操作
栈的操作有:①初始化栈,②入栈,③出栈,④获取栈顶。
1: 初始化栈
这个还是比较简单的,初始化栈时,设置默认top指针为-1,这个就不用图来展示了。
代码段:
复制代码 代码如下: #region 栈的初始化操作 /// <summary> /// 栈的初始化操作 /// </summary> /// <typeparam></typeparam> /// <returns></returns> public SeqStack<T> SeqStackInit<T>(int length) { SeqStack<T> seqStack = new SeqStack<T>(length);
seqStack.top = -1;
return seqStack; } #endregion
2:入栈
这个操作主要就是做两件事情:① 将元素从栈顶压入,② top指针自增。
代码段:
复制代码 代码如下: #region 入栈 /// <summary> /// 入栈 /// </summary> /// <typeparam></typeparam> /// <param></param> /// <param></param> public void SeqStackPush<T>(SeqStack<T> seqStack, T data) { if (SeqStackIsFull(seqStack)) throw new Exception("不好意思,栈溢出");
seqStack.data[++seqStack.top] = data; } #endregion
3:出栈
同样跟“入栈”类似,需要做两件事情,①干掉top处的元素,②top指针自减。
代码段
复制代码 代码如下: #region 出栈 /// <summary> /// 出栈 /// </summary> /// <typeparam></typeparam> /// <param></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:获取栈顶元素
这个很简单,跟“出栈”唯一不同的是不破坏栈顶元素,只是翻出来看看而已。
代码段
复制代码 代码如下: #region 获取栈顶 /// <summary> /// 获取栈顶 /// </summary> /// <typeparam></typeparam> /// <param></param> /// <returns></returns> public T SeqStackPeek<T>(SeqStack<T> seqStack) { if (SeqStackIsEmpty(seqStack)) throw new Exception("栈已空");
return seqStack.data[seqStack.top]; } #endregion
总的运行代码如下
复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text;
(编辑:焦作站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|