特殊线性结构--栈

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

 

源码实现代码依旧是用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数组改成链表即可这里就不细说了。

应用:栈的应用场景非常多,这里随便提几点 如逆波兰式,迷宫问题,汉诺塔等等都可以用使用栈优化解决。以后会在经典数据结构实战栏里一一细说。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值