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();

  • 相关阅读:
    DGA域名可以是色情网站域名
    使用cloudflare加速你的网站隐藏你的网站IP
    167. Two Sum II
    leetcode 563. Binary Tree Tilt
    python 多线程
    leetcode 404. Sum of Left Leaves
    leetcode 100. Same Tree
    leetcode 383. Ransom Note
    leetcode 122. Best Time to Buy and Sell Stock II
    天津Uber优步司机奖励政策(12月28日到12月29日)
  • 原文地址:https://www.cnblogs.com/schangxiang/p/11437798.html
Copyright © 2011-2022 走看看