栈(deap)和队列是非常重要的两种数据结构,在软件设计中应用很多。栈和队列也是线性结构,线性表、栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到限制。
栈的操作只能在表的一端进行(栈顶)
队列的插入操作在表的一端进行(队首)而其它操作在表的另一端进行
所以,把栈和队列称为操作受限的线性表。
栈
栈(Stack)是操作限定在表的尾端进行的线性表。表尾由于要进行插入、删除等操作,所以,它具有特殊的含义,把表尾称为栈顶( Top),另一端是固定的,叫栈底( Bottom)。当栈中没有数据元素时叫空栈(Empty Stack)。
栈通常记为: S= (a1,a2,…,an),S是英文单词stack的第 1 个字母。a1为栈底元素,an为栈顶元素。这n个数据元素按照a1,a2,…,an的顺序依次入栈,而出栈的次序相反,an第一个出栈,a1最后一个出栈。所以,栈的操作是按照后进先出(Last In First Out,简称LIFO)或先进后出(First In Last Out,简称FILO)的原则进行的,因此,栈又称为LIFO表或FILO表。栈的操作示意图如图所示。
栈的接口定义
public interface IStackDS<T>
{
int Count { get; }
int GetLength();//求栈的长度
bool IsEmpty(); //判断栈是否为空
void Clear();//清空操作
void Push(T item);//入栈操作
T Pop();//出栈操作
T Peek(); //取栈顶元素
}
顺序栈
栈的存储和代码实现
/// <summary>
/// 顺序栈
/// </summary>
/// <typeparam name="T"></typeparam>
public class SeqStack<T> : IStackDS<T>
{
private T[] data;
private int top;
//构造函数
public SeqStack(int size)
{
data = new T[size];
top = -1;
}
public SeqStack() : this(10)
{
}
//栈中元素个数
public int Count
{
get { return top + 1; }
}
//清空栈
public void Clear()
{
top = -1;
}
//获取栈的长度
public int GetLength()
{
return Count;
}
//判断栈是否是空的
public bool IsEmpty()
{
return Count == 0;
}
//入栈
public void Push(T item)
{
data[top + 1] = item;
top++;
}
//出栈
public T Peek()
{
return data[top];
}
//出栈删除出栈元素
public T Pop()
{
T temp = data[top];