两倍扩容机制,泛型设计,有测试代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//动态扩容顺序栈
/*
*当栈满时,两倍扩容
*/
namespace 顺序栈
{
class ArrayStack<T>
{
public T[] items;
public int Count
{
get;
private set;
}
public int Capacity
{
get;
private set;
}
public ArrayStack()
{
items = null;
Count = Capacity = 0;
}
public ArrayStack(int capacity)
{
items = new T[capacity];
Count = 0;
Capacity = capacity;
}
public ArrayStack(T[] items)
{
this.items = items;
Count = 0;
Capacity = items.Length;
}
public T Pop()
{
if(Count == 0)
{
return default;
}
Count--;
return items[Count];
}
public void Push(T data)
{
if(Capacity == 0)
{
items = new T[10];
items[Count] = data;
Count++;
Capacity = 10;
return;
}
else if(Count == Capacity)
{
T[] temp = items;
items = new T[2 * Capacity];
int i = 0;
while (i < Count)
{
items[i] = temp[i];
i++;
}
items[i] = data;
Count++;
Capacity = 2 * Capacity;
}
else
{
items[Count] = data;
Count++;
}
}
}
class Program
{
static void Main(string[] args)
{
ArrayStack<string> stack = new ArrayStack<string>();
Console.WriteLine(stack.Count);
stack.Push("第一个");
string str = stack.Pop();
Console.WriteLine(str);
Console.WriteLine("{0},{1}", stack.Count, stack.Capacity);
stack.Push("第一个");
stack.Push("第一个");
stack.Push("第一个");
stack.Push("第一个");
stack.Push("第一个");
stack.Push("第一个");
stack.Push("第一个");
stack.Push("第一个");
stack.Push("第一个");
stack.Push("第一个");
stack.Push("第一个");
stack.Push("第不知道多少个");
Console.WriteLine("{0} {1}",stack.Count, stack.Capacity);
str = stack.Pop();
Console.WriteLine(str);
}
}
}