栈也是一种线性结构。内部是对线性表或者链表的封装。栈有着先进先出的特性。如图
源码实现代码依旧是用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数组改成链表即可这里就不细说了。
应用:栈的应用场景非常多,这里随便提几点 如逆波兰式,迷宫问题,汉诺塔等等都可以用使用栈优化解决。以后会在经典数据结构实战栏里一一细说。
原文:http://blog.csdn.net/qzyf1992/article/details/19505173