zoukankan      html  css  js  c++  java
  • 3、栈

    1、栈的定义

       栈也叫堆栈,是一种限制只能在某一端进行插入和删除操作的线性表。

     

      栈的基本操作:

     

      进栈、出栈、查询、是否为空、长度。

    2、顺序栈

    2.1. 定义

           栈的顺序存储结构简称顺序栈。

       他是利用一组地址连续的储存单元存放自栈底到栈顶的数据元素,同时附设一个指针(Top)指示当前栈的位置。

    2.2. 特点

    1、数据元素存放在连续的存储地址中

    2、栈底位置固定不变

    3、栈顶位置随进栈、出栈操作而变化

    2.3. 示例

    ILinearList接口 详见 https://www.cnblogs.com/schangxiang/p/11434885.html  
     /// <summary>
        /// 栈接口
        /// </summary>
        interface IStack
        {
            void Push(object item);
            /// <summary>
            /// 清除栈顶,返回原栈顶元素
            /// </summary>
            /// <returns></returns>
            object Pop();
            /// <summary>
            /// 获取栈顶元素
            /// </summary>
            /// <returns></returns>
            object Peek();
            bool IsEmpty();
            int Size();
        }
     /// <summary>
        /// 顺序栈
        /// </summary>
        class SequenceStack : IStack
        {
            ILinearList stackList = null;
    
            public SequenceStack()
            {
                stackList = new SequenceList(100);
            }
            bool IStack.IsEmpty()
            {
                return stackList.IsEmpty();
            }
    
            object IStack.Peek()
            {
                CheckNull();
                return stackList.Get(stackList.Size() - 1);
            }
    
            object IStack.Pop()
            {
                CheckNull();
                return stackList.Remove(stackList.Size() - 1);
            }
    
            void IStack.Push(object item)
            {
                stackList.Add(stackList.Size(), item);
            }
    
            int IStack.Size()
            {
                return stackList.Size();
            }
    
            private void CheckNull()
            {
                IStack istack = this;
                if (istack.IsEmpty())
                {
                    throw new Exception("队列为NULL");
                }
            }
        }
      IStack stack = new SequenceStack();
    
                stack.Push(100);
                stack.Push(200);
                stack.Push(300);
                stack.Push(400);
    
                while (!stack.IsEmpty())
                {
                    Console.WriteLine(stack.Pop());//挨个出栈,并显示栈顶的元素
                }

    2.4. 示例-判断符号是否匹配

      /// <summary>
            /// 判断符号是否匹配
            /// 即[] {} ()是否成对出现
            /// </summary>
            /// <param name="args"></param>
            /// <returns></returns>
            private static bool IsSymmetry(string args)
            {
                /*
                 * 算法原理:出现左侧符号 [{( 就压入栈,出现右侧符号 ]}) 就出栈,并匹配出栈的元素是否是一对即可
                 */
                IStack stack = new SequenceStack();
                for (int i = 0; i < args.Length; i++)
                {
                    char a = args[i];
                    switch (a)
                    {
                        case '(':
                        case '[':
                        case '{':
                            stack.Push(a.ToString());//入栈
                            break;
                        case ')':
                            if (stack.Size() > 0)
                            {
                                //出栈
                                Console.WriteLine(a.ToString()+"配过成功:" + stack.Pop().Equals('('));
                            }
                            break;
                        case ']':
                            if (stack.Size() > 0)
                            {
                                //出栈
                                Console.WriteLine(a.ToString() + "配过成功:" + stack.Pop().Equals('['));
                            }
                            break;
                        case '}':
                            if (stack.Size() > 0)
                            {
                                //出栈
                                Console.WriteLine(a.ToString() + "配过成功:" + stack.Pop().Equals('{'));
                            }
                            break;
                    }
                }
                return stack.Size() == 0;//最后如果栈为空,代表全部匹配,反之不匹配
            }
       //判断符号是否匹配
                //string aa = "{驴啊[(我是猪)]羊呢}";//成功匹配
                string aa = "{驴啊[(我是猪]羊呢}";//不成功匹配
                bool isOk = IsSymmetry(aa);
                Console.WriteLine(isOk?"符号对全部匹配": "符号对不匹配");
                Console.ReadKey();

  • 相关阅读:
    Linux中使用dd制作文件的.img
    python正则表达式
    使用@property
    Win10添加删除虚拟打印机方法
    jenkins权限
    RedHat7.2下Jenkins的安装配置
    jenkins忘记管理员账号密码的补救方法
    RHEL软件安装
    docker 常用指令(RHLE)
    /var/run/yum.pid 已被锁定,PID 为 4242 的另一个程序正在运行
  • 原文地址:https://www.cnblogs.com/schangxiang/p/11437798.html
Copyright © 2011-2022 走看看