C#面向对象编程进阶(一) ——实现栈
如何用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#面向对象编程进阶(一) ——实现栈的更多相关文章
- 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶
Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- JS面向对象编程(进阶理解)
JS 面向对象编程 如何创建JS对象 JSON语法声明对象(直接量声明对象) var obj = {}; 使用 Object 创建对象 var obj = new Object(); JS对象可以后期 ...
- Python全栈开发之7、面向对象编程进阶-类属性和方法、异常处理和反射
一.类的属性 1.@property属性 作用就是通过@property把一个方法变成一个静态属性 class Room: def __init__(self,name,length,width,he ...
- Python之路第一课Day7--随堂笔记(面向对象编程进阶...未完待续 )
本节内容: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 一.静态方法 通过@s ...
- Python_Day8_面向对象编程进阶
本节内容: 面向对象高级语法部分异常处理 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 Socket开发基础 经典类vs新式类 classical vs new style: 经典 ...
- Python之路,Day7 - 面向对象编程进阶
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 经典类vs新式类 把下面代 ...
- Python学习笔记——基础篇【第七周】———FTP作业(面向对象编程进阶 & Socket编程基础)
FTP作业 本节内容: 面向对象高级语法部分 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 参考:http://www.cnblogs.com/wupeiqi/ ...
随机推荐
- ff
public class MyListenerProcessor implements BeanPostProcessor { @Override public Object postProcessB ...
- IOS XML解析
<?xml version = "1.0" encoding ="utf-8"?> <video>小黄人</video> ...
- heading python decorator
decorator make a wrapper function do something before and after the original function. The wrapper f ...
- win8 vs2010 openni2 配置
打开一个新项目或者已存在的项目用以使用 OpenNI 在Visual Studio 菜单中, 打开项目菜单,选择项目属性. 在C/C++ 选项卡中, 在"常规" 下, 选择 &q ...
- android命令抓LOG
手机和电脑,在电脑上开3个命令窗口,分别输入如下3个命令分别抓取mainLog.radioLog和kernalLog adb logcat -v time >main.txt adb logca ...
- .net走向设计2—设计工具
1.思维导图 2.项目管理工具 3.常用UML工具 4.数据库设计工具
- php生成网页桌面快捷方式
本文将介绍使用PHP生成网页桌面快捷方式的代码,并添加图标及解决不同浏览器保存出现的乱码问题. 我们访问网站时,如果网站的内容很有吸引,一般我们都会使用浏览器的收藏夹功能,收藏此网站. 在浏览器收藏的 ...
- 使用AOP框架所需引入的Jar包
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...
- 使用my exclipse对数据库进行操作(3)
public class class3 { public static void main(String[] args) { // TODO Auto-generated method stub tr ...
- 发现的eval的一个小问题
首先我们来看五段代码: 第一段代码: function test(){ eval('var a = 1;'); alert(a); } test(); 第二段代码: function test(){ ...