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

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

1.类方法签名初步设计

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

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

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

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

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

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

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

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

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

        public int Pop()
{
if (this.count == )
{
throw new Exception("堆栈已经为空!");
} int ele = this.array[this.count - ];
--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 * ];
for (int i = ; 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();
stack.Push();
stack.Push();
stack.Push();
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();
}

运行结果如下:

C#面向对象编程进阶(一) ——实现栈的更多相关文章

  1. 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

    Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...

  2. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

  3. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  4. JS面向对象编程(进阶理解)

    JS 面向对象编程 如何创建JS对象 JSON语法声明对象(直接量声明对象) var obj = {}; 使用 Object 创建对象 var obj = new Object(); JS对象可以后期 ...

  5. Python全栈开发之7、面向对象编程进阶-类属性和方法、异常处理和反射

    一.类的属性 1.@property属性 作用就是通过@property把一个方法变成一个静态属性 class Room: def __init__(self,name,length,width,he ...

  6. Python之路第一课Day7--随堂笔记(面向对象编程进阶...未完待续 )

    本节内容: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 一.静态方法 通过@s ...

  7. Python_Day8_面向对象编程进阶

    本节内容: 面向对象高级语法部分异常处理 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 Socket开发基础 经典类vs新式类 classical vs new style: 经典 ...

  8. Python之路,Day7 - 面向对象编程进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 经典类vs新式类 把下面代 ...

  9. Python学习笔记——基础篇【第七周】———FTP作业(面向对象编程进阶 & Socket编程基础)

    FTP作业 本节内容: 面向对象高级语法部分 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 参考:http://www.cnblogs.com/wupeiqi/ ...

随机推荐

  1. 延迟对象$q和供应商配置config

    1.angular总的$q和jquery中的延迟对象很类似,用法也差不多 m1.controller('meng',['$scope','$q',function($scope,$q){ var df ...

  2. C++面试中string类的一种正确简明的写法

    本文首发于酷壳网 http://coolshell.cn/articles/10478.html 先说说程序员(应届生)面试的一般过程,一轮面试(面对一到两个面试官)一般是四.五十分钟,面试官会问两三 ...

  3. win10+vs2015+opencv3.0 x86/x64配置(debug+release)

    最近做一些图像识别的项目,用到了opencv,opencv3.1没有x86版本,所以只能用opencv3.0来完成,下面介绍一下在window10下vs2015 配置opencv3.0的过程(x86和 ...

  4. 易全解token获取

    //易全解app             string strClientID = "2016061711434943493606";             string str ...

  5. 初识C语言

    C语言是开发iOS软件的基础. 一.C语言简介 1.      简史 1)          C语言于1972年发明,首次使用是用于重写UINX操作系统(UNIX以前主要是用汇编语言写的,它奠定了操作 ...

  6. wifi,网关相关标识的获取

    获取WIFI的相关信息 - (void)getWifiInfo { NSArray *ifs = (__bridge_transfer NSArray *)CNCopySupportedInterfa ...

  7. 检查Chunksum与Chunk Data之间的缓冲区发送到DataNode节点

    我们会看到左边"iOS Apps"下面有四个选项:"Certificates"."Identifiers"."Devices&qu ...

  8. Codeigniter 在Active Record中限制批量更新数目

    今天手头电商项目有个需求是:将订单中的优惠券自动发放给买家,所以要只更新优惠券表中的某几行数据,查了手册和网络都没有解决办法. 一开始用循环和遍历来做都是错的,因为update语句一下就更新掉所有符合 ...

  9. Angular常用功能

    1.默认选择让第0个元素的class为active ng-class="{active:$index == 0}" 2.指令的例子 <!DOCTYPE html> &l ...

  10. 15.Xcode8 升级遇到的问题

    一:注释快捷键cmd+/不能用,解决方法: 1. Swift_3.0 没法快捷键(command+/)注释的原因:这个是因为苹果解决xcode ghost,把插件屏蔽了. 2. 解决办法: (1) 终 ...