栈是一种特殊的线性结构,是一种运算受限的数据结构,栈的特点就是是
先进后出,跟我们的乒乓球筒,羽毛球筒一样,先放进去的在
栈底,后放进去的称之为
顶点或者栈顶。
这里,我们用两种方式表达栈的运用,顺序表和链表。
顺序栈
这里标记顶点,因为栈的这种先进后出的特殊结构,入栈和出栈都是从顶点操作的。
/// <summary>
/// 顺序栈
/// </summary>
class LinkStack
{
const int Maxsize = 100;
public string[] data;
public int top;
public LinkStack()
{
data = new string[Maxsize];
top = -1;
}
#region 判断是否为空栈 O(1)
public bool StackEmpty()
{
return (top == -1);
}
#endregion
#region 进栈 O(1)
public bool Push(string values)
{
//满栈无法进栈
if (top >= Maxsize-1)
{
return false;
}
top++;
data[top] = values;
return true;
}
#endregion
#region 出栈 O(1)
public bool Pop(ref string values)
{
//判断是否为空栈
if (StackEmpty())
{
return false;
}
values = data[top];
top--;
return true;
}
#endregion
#region 获取顶点值 O(1)
public bool GetTop(ref string values)
{
if (StackEmpty())
{
return false;
}
values = data[top];
return true;
}
#endregion
}
链式栈:
这里也是一样,保存头部,每次出栈入站都是操作头部。
/// <summary>
/// 链式栈存储结构
/// </summary>
class LinkListStack
{
public string data;
public LinkListStack next;
}
/// <summary>
/// 链式栈的操作
/// </summary>
class LinkStackClass
{
LinkListStack head = new LinkListStack();
public LinkStackClass()
{
head.next = null;
}
#region 判断链式栈是否为空 O(1)
public bool StackEmpty()
{
return (head.next == null);
}
#endregion
#region 入栈 O(1)
public void Push(string values)
{
LinkListStack stacks = new LinkListStack();
//头部进栈
stacks.data = values;
stacks.next = head.next;
head.next = stacks;
}
#endregion
#region 出栈 O(1)
public bool Pop(ref string values)
{
LinkListStack stack;
//判断栈是否为空
if (head.next==null)//StackEmpty()
{
return false;
}
//出栈从头部出栈
stack = head.next;
values = stack.data;
head.next = stack.next;
stack = null;
return true;
}
#endregion
#region 取栈的顶点 O(1)
public bool GetTop(ref string values)
{
LinkListStack stack;
//判断栈是否为空
if (head.next == null)//StackEmpty()
{
return false;
}
stack = head.next;
values = stack.data;
return true;
}
#endregion
}