小伙伴们好啊,有好好在家里躺着吗,现在疫情如此严重,躺着在床也是对国家一种贡献喔(●’◡’●),若是觉得太闲了,不如拿起一本书好好读读看,学习学习知识,日积月累,相信你定能有所成长的喔。好了,上次我们把链表学习完了,这次我们来接触新的结构:堆栈
什么是堆栈:
说起堆栈,相信大家都不陌生,在大一的时候都学习过C语言,当时老师说的知识都忘得差不多了,印象最深的就是后入先出,在这里,我要再复述一下堆栈,如果觉得自己对堆栈的认识感到摸棱两可的,千万别觉得麻烦,请认真跟我一块学习,温故而知新。若是基础扎实的同学,可以直接跳过。
堆栈是一种线性结构,也是特殊的线性表
下面让我们来举个事例来认识一下堆栈:
①计算机是如何进行表达式求值?如:6/2-3+4*2=?
相信大家都会解,大家都是凭着运算符优先级原则,但正因为存在优先级,计算机需要全部扫迷,再进行判断,是不利于计算机的,因此孕育出了新的一种计算方式:后缀表达式,它的特点是运算符在运算数之后,顺便一提前面提及的算术表达式是中缀表达式。
所以用后缀表达式表达则为:6 2/3-4 2*+=?
它的算数过程也是从左向右扫描,并逐个处理运算数和符号,首先扫描到6和2,进行存储,其次扫描到/号,将之前的两个数相除得到一个结果并存入,扫描到3和-号,进行3和第一个结果相减操作得第二个结果并存入,继续往后扫描得4,2和*号,将4和2相乘得结果8进行存入,又看到+号,就将第二个结果和8相加得最终结果8。
这种方式得要点在于:
①当遇到运算数的时候需要进行存储
②当遇到运算符号的时候需要将最近两个数进行运算
因此,按照这样的策略,我们需要一个存储方式,能顺序存储运算数,并在需要的时候“倒序输出”(结构类似于薯片筒),而这个存储方式就是堆栈。
堆栈的抽象数据类型描述:
堆栈:具有一定操作约束的线性表,只在一端(栈顶)做插入和删除,其中,插入数据称为入栈,删除数据称为出栈,特点归结为后入先出。
栈的顺序存储实现
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成,下面让我们来用代码实现
class SeqStack<T>
{
private T[] Data;
private int Maxsize;//最大容量
private int Top;//最顶位置
public SeqStack(int maxsize)
{
Maxsize = maxsize;
Top = -1;
Data = new T[Maxsize];
}
public int Count()
{
return Top+1;
}
public int GetLength()
{
return Maxsize;
}
public bool IsFull()
{
return Top == Data.Length - 1;
}
public bool IsEmpty()
{
return Top == -1;
}
public void Push(T data)
{
if (IsFull())
{
Console.WriteLine("栈已满,入栈失败!");
}
else
{
Data[++Top] = data;
}
}
public T Pop()
{
if (IsEmpty())
{
Console.WriteLine("栈为空,出栈失败!");
return default(T);
}
return Data[Top--];
}
public T Peek()
{
if (IsEmpty())
{
Console.WriteLine("栈为空,出栈失败!");
return default(T);
}
return Data[Top];
}
public void Clear()
{
Top = -1;
}
}
验证功能
SeqStack<int> a = new SeqStack<int>(10);
Console.WriteLine("将进行1-4的入栈操作,是否进行? 若进行输入Y,则输入N");
if (Console.Read().ToString()=="N")
{
return;
}
for (int i = 1; i <5; i++)
{
a.Push(i);
}
Console.WriteLine("-------------------入栈完成--------------------");
Console.WriteLine("-----------------进行访问栈顶------------------");
for (int i = 1; i < 5; i++)
{
Console.WriteLine(a.Peek());
}
Console.WriteLine("-------------------进行出栈--------------------");
for (int i = 1; i < 5; i++)
{
Console.WriteLine(a.Pop());
}
Console.ReadKey();
注意:这里访问栈顶是不进行删除操作,而出栈则访问加删除。
好了,今天的顺序栈的学习到此结束,多多努力学习喔各位