您的位置:首页 > 职场人生

黑马程序员_栈的学习总结

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];//返回栈顶的数据项
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: