黑马程序员_栈的学习总结
2014-01-08 23:42
309 查看
namespace MyStack { /* 栈的学习 * 栈中的数据只能在表的一端进行添加或者删除操作。 * 栈中的数据是从表的末端进行存储的,通常我们将这一端称为“栈顶” * 栈是先进后出的数据结构(LIFO Last In First Out) */ class Program { static void Main(string[] args) { //1、栈的基本操作 /* (1)、栈的两种基本的操作:向栈内添加数据项(进栈Push)和从栈内移除数据项(出栈Pop) * (2)、查看栈顶的数据,可以使用Pop (返回栈顶的数据项,但同时该数据项也会移除掉),但在C#语言中定义了名为 Peek的方法可以实现该功能 * (3)、Clear 将栈全部清空 * (4)、Count 记数属性 * (5)、StackEmpty 判断栈的状态 返回 bool类型 */ //2、Stack类的实现 //使用ArrayList实现Stack类,通过创建ArrayList对象来存储栈的数据项 //实例:通过栈判断一个字符串是否是“回文” string str = "sees"; string ch;//出栈后的栈中数据项的集合组成的字符串 bool result = true;//判断的结果 CStack cs=new CStack();//创建一个栈类的对象 for (int i = 0; i < str.Length; i++) { cs.Push(str.Substring(i, 1));//获取一个字符,执行进栈 } int pos=0;// while(cs.Count>0) { ch=cs.Pop().ToString();//获取出栈前栈顶的数据项 if(ch!=str.Substring(pos,1)) { result=false; break; } pos++; } if(result) { Console.WriteLine("该字符串是回文!"); } else { Console.WriteLine("该字符串不是回文!"); } Console.ReadKey(); //关于Stack类 /* Stack类是ICollection接口的一个实现,代表了一个LIFO的群集或一个栈。该类在.NET框架中是作为循环缓冲来实现的,这使得栈可以动态地分配进栈数据项的空间。 * 这个类似与动态数组ArrayList ,每次当栈达到满数量的时候就会自动地将容量翻倍 */ Stack s = new Stack(); Console.WriteLine(s.Count); Stack<string> st = new Stack<string>(); Console.WriteLine(st.Count); string[] names = { "a", "b", "c", "b", "c", "b", "c", "b", "c", "b" }; Stack s2 = new Stack(names);//如果执行出栈操作,则首先将移除掉 “b” s2.Push("d"); Stack s3 = new Stack(5);//实例化并指定栈的初始容量 for (int i = 0; i < 6; i++) { s3.Push(i); } Console.WriteLine("栈中的数据项数量:" + s3.Count);//当超过初始容量的时候,栈会自动的 object[] arrobj=new object[s3.Count]; s3.CopyTo(arrobj, 0);//将栈中的数据项复制到数组中 (按照出栈的顺序进行)并且从指定数组索引位置开始 //ToArray()将栈中数据项集合转换为一个object类型数组 (原理同CopyTo 但是不能指定起始索引位置) Console.ReadKey(); } } /// <summary> /// Stack类 /// </summary> class CStack { private int p_index;//用来计算栈中的数据项索引 private ArrayList list;//用来存储栈中的数据项 public CStack() { list = new ArrayList();//实例化 p_index = -1;//初始化默认为-1,每增加(移除)一个数据项自增(自减)1 } /// <summary> /// 获取数据项的数量 /// </summary> public int Count { get { return list.Count; } } /// <summary> /// 出栈操作 /// </summary> /// <param name="obj">数据项</param> public void Push(object obj) { list.Add(obj); p_index++; } /// <summary> /// 出栈 (移除的是栈顶数据项,所以此处不需要参数) /// </summary> public object Pop() { object obj = list[p_index];//获取栈顶的数据项 list.RemoveAt(p_index);//移除栈顶的数据项 p_index--;//栈顶索引自减 return obj;//返回移除前的栈顶数据项 } /// <summary> /// 清除栈中所有的数据项 /// </summary> public void Clear() { list.Clear(); p_index = -1;//清除后初始化索引 } /// <summary> /// 获取栈顶的数据项 /// </summary> /// <returns></returns> public object Peek() { return list[p_index];//返回栈顶的数据项 } } }
相关文章推荐
- 面试题之陈利人 单链表和之恋
- 公司年会-程序员相亲-小品
- 程序员技术练级攻略
- 面试题
- 黑马程序员_09_多态的演变过程
- 面试题:求最小的K个数。
- 黑马程序员-------第一天
- 百度两道面试题
- java笔试面试二
- 这么多年了,还是程序员!
- 关于职业,关于事业
- [转] 挨踢职场求生法则
- 【黑马程序员】Java7K面试题20:交通灯管理系统
- 如何突破职场瓶颈
- java 异常处理 黑马程序员学习笔记(6)
- 黑马程序员---线程之新技术
- java面向对象 黑马程序员学习笔记(5)
- java i/o黑马程序员学习笔记(1)
- java i/o黑马程序员学习笔记(2)
- 黑马程序员---银行业务调度系统-分析