1. 栈
先进后出是栈。只能一端进行添加(入栈)或删除(出栈)操作,这一端叫栈顶。应用例如:数组反转、递归。栈的具体操作(Stack):
-
往栈中插入元素:void Push(e):
-
取出栈顶元素并删除:E Pop()
-
查看栈顶元素:E Peek()
-
栈中数组元素数量:int Count { get; }
-
栈是否空:bool IsEmpty { get; }
设计栈接口来实现
interface IStack<E>
{
int Count {
get; }//栈中数组元素数量
bool IsEmpty {
get; }//栈是否空
void Push(E e);//往栈插入元素
E Pop();//删除栈顶元素
E Peek();//查询栈顶元素
}
1.1 数组栈
数组栈类Array1Stack,基于Array1动态数组,实现栈接口
namespace StackLearn
{
/// <summary>
/// //动态数组框架
/// </summary>
class Array1<T>
{
private T[] data;//存储元素的静态数组data
private int N;//存储元素个数N
public Array1(int capacity)//有参构造
{
data = new T[capacity];
N = 0;
}
public Array1() : this(10) {
}//无参构造
//public Array1()
//{
// data = new int[10];
// N = 0;
//}
private void ResetCapacity(int newCapacity)
{
T[] newData = new T[newCapacity];
for (int i = 0; i < N; i++)
newData[i] = data[i];
data = newData;
}
public int Capacity//获取数组容量
{
get {
return data.Length; }
}
public int Count//获取数组元素个数
{
get {
return N; }
}
public bool IsEmpty//判断数组是否为空
{
get {
return N == 0; }
}
public void Add(int index, T e)//添加元素到数组中的指定索引位置
{
if (index < 0 || index > N)//判断索引位置是否合法
throw new ArgumentException("数组索引越界");
if (N == data.Length)//判断数组容量是否满了
ResetCapacity(2 * data.Length);
for (int i = N - 1; i >= index; i--)//从数组末尾向后移动元素
data[i + 1] = data[i];
data[index] = e;
N++;
}
public void AddLast(T e)//数组末尾添加元素
{
Add(N, e);
}
public void AddFirst(T e)//数组头部添加元素
{
Add(0, e);
}
public T Get(int index)//获取指定索引位置元素
{
if (index < 0 || index >= N)
throw new ArgumentException("数组索引越界");
return data[index];
}
public T GetFirst()//获取首个元素
{
return Get(0);
}
public T GetLast()//获取末尾元素
{
return Get(N - 1);
}
public void Set(int index, T newE)//修改指定索引的元素
{
if (index < 0 || index >= N)
throw new ArgumentException("数组索引越界");
data[index] = newE;
}
public bool Contains(T e)//是否包含元素
{
for (int i = 0