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, 栈顶的元素就是表达式的结果值。

浙公网安备 33010602011771号