标签:blog http io ar sp for on 数据 div
一、栈的定义
栈是限定仅在表尾进行插入和删除操作的线性表;栈又称为后进先出的线性表(LIFO)。
栈顶:允许插入和删除操作的一端称为栈顶;而另一端则为栈底。
栈的操作:插入数据称为进栈(压栈、入栈);栈的删除操作称为出栈(弹栈)。
如下图所示:
二、栈的抽象数据类型
栈是一种特殊的线性表,因此具有线性表的所有特性。如除根节点以外,有且仅有一个前驱节点等。
三、栈的顺序存储结构及实现
C#代码实现
/// <summary> /// 栈的顺序存储结构 /// </summary> /// <typeparam name="T"></typeparam> public class SequenceStoregeStackt<T> { //栈的最大空间 private int _maxSize; //栈顶指针 private int _top; //栈的数据用数据进行存储 private T[] _storage; public SequenceStoregeStackt(int maxSize) { _maxSize = maxSize; _storage = new T[maxSize]; } /// <summary> /// 判断栈是否为空 /// </summary> /// <returns></returns> public bool IsEmpty() { return _top == -1; } /// <summary> /// 添加元素 /// 栈只能从栈顶添加元素 /// </summary> /// <param name="t">添加的元素</param> public void Push(T t) { if (_top == _maxSize - 1) throw new ApplicationException("The stack is full."); //将元素添加到栈顶 _storage[_top + 1] = t; //将栈顶指针+1 _top++; } /// <summary> /// 取出栈顶元素 /// </summary> public T Pop() { T t = default(T); if (!IsEmpty()) { t = _storage[_top]; _top--; } return t; } }
四、栈的链式存储结构
C#代码实现
/// <summary> /// 栈的链式结构实现 /// </summary> public class LinkedStack<T> { /// <summary> /// 栈的指针 /// </summary> private Node<T> _top; /// <summary> /// 栈的长度 /// </summary> public int Length { get; set; } public LinkedStack() { } /// <summary> /// 判断栈是否为空 /// </summary> /// <returns></returns> public bool IsEmpty() { return _top == null; } /// <summary> /// 插入元素 /// </summary> /// <param name="t"></param> public void Push(T t) { //栈的连式存储只有在内存满了,才会添加失败 Node<T> node = new Node<T>(); node.t = t; //将当前的栈顶元素赋值给新节点的直接后继 node.NextNode = _top; //将新的节点赋给栈顶指针 _top = node; //将栈的长度+1 Length++; } /// <summary> /// 取出栈顶元素 /// </summary> /// <returns></returns> public T Pop() { T t = default(T); if (!IsEmpty()) { //取得栈顶元素 Node<T> node = _top; //取得值 t = node.t; //修改栈顶指针 _top = _top.NextNode; //修改栈长度 Length--; } return t; } } /// <summary> /// 栈的元素 /// </summary> /// <typeparam name="T"></typeparam> public class Node<T> { /// <summary> /// 栈的数据元素 /// </summary> public T t { get; set; } /// <summary> /// 下一节点指针 /// </summary> public Node<T> NextNode { get; set; } }
五、栈的应用之递归
斐波那契数列【具体解释参考百度百科】
斐波那契数列数学表示:
C#代码实现
/// <summary> /// 斐波那契数列实现 /// </summary> public class FibonacciDemo { /// <summary> /// 递归实现 /// </summary> /// <param name="value">输入的数列项</param> /// <returns></returns> public int Execute(int value) { if (value < 2) return 1; return Execute(value - 1) + Execute(value - 2); } /// <summary> /// 斐波那契的循环实现 /// </summary> /// <param name="value"></param> /// <returns></returns> public int LoopExecute(int value) { int[] arr = new int[value]; if (value == 0) return 0; if (value == 1) return 1; int sum = 0; arr[0] = 0; arr[1] = 1; for (int i = 2; i < value; i++) { int temp = arr[i - 1] + arr[i - 2]; sum = sum + temp; } return sum; } }
六、栈的应用之四则运算
后缀表达式(逆波兰)
标签:blog http io ar sp for on 数据 div
原文地址:http://www.cnblogs.com/xiuyuanjing/p/4133914.html