如何用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. Yii2 return redirect()

    理想情况下是: return $this->redirect($url);立马跳转, 而不执行后续代码; 但是在init方法中是无效的,需要加上Yii::$app->end();即可终止后 ...

  2. 如何搭建一个WAMP环境

    最近的一些比赛需要用到PHP,所以急需配置一个PHP的环境,所以分享出来我的经历  一.使用wampserver 这是一个集成软件包,可以一键配置Apache+Mysql+PHP,还具有简单的图形界面 ...

  3. iOS开发时,在Xcode中添加多个Targets进行版本控制

    在iOS开发中,很可能有以下场景:需要开发多个版本,或因需区分收费版,免费版,或因为网络环境需要区分测试版,发布版,或因渠道不同需要区分企业版,AppStore版等等.解决办法无非就是CheckOut ...

  4. 《笨办法学C》笔记之基础语法

    这篇笔记不怎么系统,只记录自己比较生疏的知识 变量定义 类型 定义 格式化符号 备注 整数 int %d 长整型 long %ld 单精度浮点 float %f 双精度浮点 double %f 字符 ...

  5. exec、source以及bash的区别(zz)

    在bash shell中,source.exec以及sh都可以用来执行shell script,但是它们的差别在哪里呢? sh:父进程会fork一个子进程,shell script在子进程中执行 so ...

  6. 数据库.bak文件还原报错的处理办法

    今天从网上下了个Demo,里面有个.bak文件,就试着还原了一下,结果发现报了错.是了两种方式导入,都不行. 最终找到了解决办法: 可以直接用sql语句对.bak文件进行还原. RESTORE DAT ...

  7. swift3.0:associatedtype

    E文:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Lang ...

  8. Swift基础语法(五)枚举、结构体与类的区别

    swift中的结构体值可以是整型.浮点型.字符串.字符.元祖,如果不赋值默认为整型且从0开始计数,如果为整型枚举且要求不是从0开始只需指定枚举的第一个值以后的值自动依次加1 引用方式也与oc有所出入 ...

  9. codeIgniter怎么实现对input type=text对话框blur事件的监听以及传值?

    如题,这个问题怎么解决? 用JS和前端框架习惯了,现在学后端框架,感觉各种坑...

  10. MyBatis Generator 详解 【转来纯为备忘】

    版权声明:版权归博主所有,转载请带上本文链接!联系方式:abel533@gmail.com   目录(?)[+] MyBatis Generator中文文档 运行MyBatis Generator X ...