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

        运行结果如下:

          

     

  • 相关阅读:
    计算机网络学习笔记——计算机网络概述
    基础续一
    Python基础一
    linux lvm的操作手册_pvcreate_vgcreate_lvcreate_相关
    Oracle Linux 挂载存储
    MegaCLI SAS RAID Management Tool
    DELL RACADM 批量升级戴尔IDRAC固件
    LSI MegaCli 命令使用4
    LSI MegaCli 命令使用2
    LSI MegaCl i命令使用1
  • 原文地址:https://www.cnblogs.com/aoyeyuyan/p/4224060.html
Copyright © 2020-2023  润新知