数据结构与算法(C++)– 栈(Stack)
数据结构与算法(C++)– 栈(Stack)
1、栈是什么
- 后进先出(Last in, First out)
- push 入栈,pop 出栈,top栈顶
2、栈的实现
单链表:在单链表的前端插入实现 push 操作,删除前端元素实现 pop 操作,前端元素即为 top。
数组:用 vector 的 push_back 和 pop_back 实现 push 和 pop 操作
3、栈的应用
平衡符号 (Balancing Symbols): 检查左右括号是否平衡
- 新建一个空栈
- 依次读取所有符号。 如果是左括号压栈;如果是右括号且栈为空提示错误,否则出栈一个符号,如果出栈的符号不是与之配对的左括号提示错误
- 读取完所有符号后栈不是空的,提示出错
第一排符号平衡,第二排出栈符号不匹配出错。
后缀表达式 (Postfix Expressions):
- 新建一个空栈
- 依次读取字符,如果是数字压栈;如果是符号则出栈两个数字进行运算,把结果压栈。
- 读取完所有的字符,栈中只有一个元素即计算结果。
计算后缀表达式:5 7 3 * + 6 2 * 1 + 10 / -
中缀到后缀的转换 (Infix to Postfix Conversion):
- 新建一个空栈
- 依次读取字符,如果是数字直接输出,符号不直接输出
- 如果是符号且栈是空的或者目前栈顶的符号优先级小于正在读取的符号,则把符号压栈;如果目前栈顶的符号优先级大于正在读取的符号,则不断出栈直到栈顶的符号优先级小于正在读取的符号,然后把正在读取的符号压栈。
- 如果读取到右括号(不压栈),则不断出栈直到遇到左括号(出栈但不输出)。
中缀表达式:5 + 7 * 3 - ( 6 * 2 + 1 ) / 10 转为后缀表达式:5 7 3 * + 6 2 * 1 + 10 / - :
中缀转后缀并计算: