zoukankan      html  css  js  c++  java
  • C#面向对象编程进阶(一) ——实现栈

        如何用C#编写一个栈类?   

        关键在于这样的一个类应该如何设计呢?首先要确立面向对象的编程思想,即类是对实体进行合理地抽象和建模,而这种思想将贯彻在我们编程的整个过程中。下面我们一步一步来做。

    1.类方法签名初步设计

        对于设计一个类而言我们应该由外而内的进行设计,首先考虑它对外部提供的接口,再去考虑其内部的安排。对于栈而言,最重要的外部特性就是压栈和弹栈,所以要设计两个方法Push和pop,对于压栈而言,压进去的元素存放在哪,所以就要用数组来开辟一段连续的存储空间来对栈进行顺序存储。所以初步设计如下:

        public class Stack
        {
            private int[] array = new int[3];
    
            public void Push(int element)
            {
            }
    
            public int Pop()
            {
                return 0;
            }
        }  

          具体的方法应该如何实现呢?我们知道压栈和弹栈都是在栈顶进行的,如何表示栈顶呢?我们可以设置一个计数器cout对每次压栈操作进行计数,同样对于弹栈操作也进行计数,使得计数器总是表示栈内元素的个数。所以在之前的代码中添加相关语句,现在代码如下:

        public class Stack
        {
            private int[] array = new int[3];
            private int count;
    
            public void Push(int element)
            {
                count++;
            }
    
            public int Pop()
            {
                count--;
                return 0;
            }
        }  

        接着我们来分别实现两个方法的功能。

            public void Push(int element)
            {
                this.array[this.count] = element;
                count++;
            }
    
            public int Pop()
            {
                int ele = this.array[this.count - 1];
                count--;
                return ele;
            }

        至此两个方法的功能已经基本实现。

    2.设计衍化 -- 考虑到边界情况,使用异常机制

        现在要考虑一个问题,即栈的存储空间是用数组来固定分配的,那么压栈就可能出现栈满后溢出的情况。为了应对这种异常情况我们需要采取相应的措施。类似的栈也会出现栈空的情况下弹栈的情况。我们先来处理后者:

            public int Pop()
            {
                if (this.count == 0)
                {
                    throw new Exception("堆栈已经为空!");
                }
    
                int ele = this.array[this.count - 1];
                --this.count;
                return ele;
            }

        然后我们在测试方法中添加try-catch语句便能够对抛出的异常进行处理。

        而对于push方法,我们希望在栈满的情况下追加存储空间应该如何做呢?

        我们再定义一个数组,开辟出两倍于原数组的连续存储空间,然后将原数组中的元素拷贝给新数组,再将新数组的引用赋值给原数组以便于外部使用。

            public void Push(int element)
            {
                if (this.count == this.array.Length)
                {
                    int[] array2 = new int[this.array.Length * 2];
                    for (int i = 0; i < this.array.Length; i++)
                    {
                        array2[i] = array[i];
                    }
                    this.array = array2;
                }
                    this.array[this.count] = element;
                    this.count++;
    
    
            }

        这样一来,这个类就已经基本设计好了。

    3.功能测试

        在main方法中添加如下测试代码:

            static void Main(string[] args)
            {
                try
                {
                    Stack stack = new Stack();
                    stack.Push(2);
                    stack.Push(5);
                    stack.Push(8);
                    stack.Push(9);
                    int ele1 = stack.Pop();
                    Console.WriteLine("{0}", ele1);
                    int ele2 = stack.Pop();
                    Console.WriteLine("{0}", ele2);
                    int ele3 = stack.Pop();
                    Console.WriteLine("{0}", ele3);
                    int ele4 = stack.Pop();
                    Console.WriteLine("{0}", ele4);
                }
                catch (Exception exception)
                {
                    Console.WriteLine("执行发生错误!" + exception.Message);
                }
                Console.Read();
            }

        运行结果如下:

          

     

  • 相关阅读:
    May 1 2017 Week 18 Monday
    April 30 2017 Week 18 Sunday
    April 29 2017 Week 17 Saturday
    April 28 2017 Week 17 Friday
    April 27 2017 Week 17 Thursday
    April 26 2017 Week 17 Wednesday
    【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式
    April 25 2017 Week 17 Tuesday
    April 24 2017 Week 17 Monday
    为什么丑陋的UI界面却能创造良好的用户体验?
  • 原文地址:https://www.cnblogs.com/aoyeyuyan/p/4224060.html
Copyright © 2011-2022 走看看