栈也是一种线性结构。内部是对线性表或者链表的封装。栈有着先进先出的特性。如图

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 栈队列
{
public class MyStack
{
//栈的最大长度和初始长度
int Top = 10;
//每次的增量
private readonly int STACKINCREMENT = 10;
private int count = 0;
//栈的长度
public int Count
{
get { return count; }
set { count = value; }
}
//我们把栈设置成动态增长的
T[] nums;
public MyStack()
{
nums = new T[Top];
}
public MyStack(T[] items):this()
{
//将每个元素压栈
foreach (T item in items)
{
Push(item);
}
}
///
/// 压栈操作 ///
///
压栈的元素
public void Push(T elem)
{
//做一次判断防止意外的发生
if (Top > 0)
{
//再加就超界了,从新开辟空间
if (count >= Top)
{
// 最大长度已经变化了
Top = count + STACKINCREMENT;
T[] items = new T[Top];
if (count > 0)
{
//拷贝
Array.Copy(nums, 0, items, 0, count);
}
nums = items;
}
}
else {
Top = 100;
}
//压栈
//长度比数组头少1
nums[count] = elem;
count++;
}
///
/// 取出栈顶元素 ///
///
public T GetTop()
{
if (count == 0)
{
throw new Exception("栈是空的");
}
return nums[count - 1];
}
///
/// 取出并删除栈顶元素 ///
///
public T Pop()
{
if (count == 0)
{
throw new Exception("栈是空的");
}
//临时保存栈顶元素
T data = nums[count - 1];
nums[count--] = default(T);
return data;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
//从栈底抽元素出来
for (int i = 0; i < count; i++)
{
sb.Append(nums[i].ToString()+ " ");
}
return sb.ToString();
}
}
}
测试代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 栈队列
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入测试数组类似5 4 3");
string[] s = Console.ReadLine().Split(' ');
int[] nums = new int[s.Length];
for (int i = 0; i < s.Length; i++)
{
nums[i] = Convert.ToInt32(s[i]);
}
MyStack
sk = new MyStack
(nums); Console.WriteLine("栈的输出是"); Console.WriteLine(sk.ToString()); Console.WriteLine("将0-9压入栈"); for (int i = 0; i < 10; i++) { sk.Push(i); } Console.WriteLine("栈的输出是"); Console.WriteLine(sk.ToString()); Console.WriteLine("取出栈顶元素"); Console.WriteLine(sk.GetTop()); Console.WriteLine("取出并删除栈顶元素"); Console.WriteLine("栈顶元素是"); Console.WriteLine(sk.Pop()); Console.WriteLine("栈的输出是"); Console.WriteLine(sk); Console.Read(); } } }
结果如下

栈的链式存储和这个差不多。把内部的nums数组改成链表即可这里就不细说了。
应用:栈的应用场景非常多,这里随便提几点 如逆波兰式,迷宫问题,汉诺塔等等都可以用使用栈优化解决。以后会在经典数据结构实战栏里一一细说。