Blog No.2/链式栈需要注意的点+堆栈应用之表达式求值

///链式栈需要注意的点///

对于单向链表构成的栈,例如【A→B→C→D】,其中A是作为“栈顶”,D是作为“栈底”;即在一个竖直摆放的、用单向链表实现的栈中,每个node间的next指针是垂直向下指底的。Pop和Push操作均在如 (图1) 所示的Top栈顶上操作。

链式堆栈的栈顶是一个【头结点】,不用于存储任何元素内容。当CreateStack初始化一个栈时,就创造了一个头结点(即CreateStack所返回的指针S所指向的结点)。初始时,该栈中没有真正表示有意义数据的结点。所以,该栈的结构是如 (图2) 和 (图3) 这样的:

(←图1)    (←图2) (←图3)

 

以下为MOOC视频截图,是建立空栈 & 判断该栈是否为空 的代码

 

所以,用来指代一个链式栈的指针S,永远就是【栈顶元素Head】

判断链式栈是否为空,只要判断【栈顶元素Head】的next项是否为NULL

 

 

///堆栈应用之表达式求值///

中缀表达式转化为后缀表达式

对该中缀表达式从左到右进行遍历

① 运算数:直接输出;

② 左括号:直接压入堆栈;(括号是最高优先级,无需比较而直接压栈。但是需要注意的是,在堆栈中,左括号视为优先级最低) (因为这样才能确保其它的运算符+-*/等能够正常入栈)

③ 右括号:一个个不停地将栈顶的运算符弹出并输出,直到遇到左括号方停止;(将左括号出栈,但不输出。注意左右括号都是不会出现在后缀表达式里的)(遇到右括号意味着括号范围已经划定好了,应当输出括号内的运算符内容)

④ 运算符:

若:【扫描到的运算符之优先级】大于【栈顶运算符之优先级】时,则把扫描到的运算符压入栈;

若:【扫描到的运算符之优先级】小于等于【栈顶运算符之优先级】时,将栈顶运算符弹出并输出;如果栈未空,则此时栈顶会有新的运算符,再将【扫描到的运算符之优先级(也就是刚刚待入栈的那个运算符的优先级)】与【新的栈顶运算符的优先级】进行比较。直到【扫描到的运算符之优先级】大于【栈顶运算符优先级】为止,然后将该扫描到的运算符压栈:

⑤ 若各对象处理完毕,则按顺序弹出并输出栈中所有运算符。

 

后缀表达式

从左到右读入 后缀表达式 的各项。

①运算数:入栈;

②运算符:从堆栈中弹出适当元素的运算数,计算并将结果入栈。

Lastly, 栈顶的元素就是表达式的结果值。

posted @ 2020-08-14 23:30  JerryOops  阅读(97)  评论(0)    收藏  举报