栈也是一种线性结构。内部是对线性表或者链表的封装。栈有着先进后出的特性。如图
源码实现代码依旧是用c#写的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 栈队列
{
public class MyStack<T>
{
//栈的最大长度和初始长度
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);
}
}
/// <summary>
/// 压栈操作
/// </summary>
/// <param name="elem">压栈的元素</param>
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++;
}
/// <summary>
/// 取出栈顶元素
/// </summary>
/// <returns></returns>
public T GetTop()
{
if (count == 0)
{
throw new Exception("栈是空的");
}
return nums[count - 1];
}
/// <summary>
/// 取出并删除栈顶元素
/// </summary>
/// <returns></returns>
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<int> sk = new MyStack<int>(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数组改成链表即可这里就不细说了。
应用:栈的应用场景非常多,这里随便提几点 如逆波兰式,迷宫问题,汉诺塔等等都可以用使用栈优化解决。以后会在经典数据结构实战栏里一一细说。