特殊线性结构--栈

2014-11-24 02:31:28 · 作者: · 浏览: 0

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

\

源码实现代码依旧是用c#写的

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数组改成链表即可这里就不细说了。

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