数据结构总结 之 栈

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Albert_Bolt/article/details/82356580

栈(stack)

  • 栈是限定仅在表尾进行插入或删除操作的线性表。
  • 允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。
  • 特点:后进先出 (LIFO)
  • 进栈push,出栈pop
顺序栈
  • 栈的顺序存储结构,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素
  • 指针top指向栈顶元素在顺序栈中的下一个位置
  • base为栈底指针,指向栈底的位置
链式栈
  • 无栈满问题,空间可扩充
  • 插入与删除仅在栈顶处执行
  • 栈顶在链头
  • 适合于多栈操作
栈的应用
  • 数制转换:n = ( n / d ) * d + n mod d
  • 迷宫求解:
    • 若当前位置可通,则将当前位置插入栈顶;若该位置是出口位置,则算法结束;否则切换当前位置,将按顺时针方向旋转的相邻位置为新的当前位置
    • 若四周均无通路,则将当前位置从栈顶中删除;如果栈不空,则重新测试新的栈顶位置。
  • 表达式求值:
    • 中缀表示为表达式的正常表示方法
    • 相邻两个操作符的计算次序:先级高的先计算;优先级相同的自左向右计算;当使用括号时从最内层括号开始计算。
    • 操作符有4种类型:
      (1)算术操作符:双目操作符(+、-、*、/ 和%)和单目操作符(-)。
      (2)关系操作符:<、<=、==、!=、>=、>。用于比较。
      (3)逻辑操作符:与(&&)、或(||)、非(!)。
      (4)括号‘(’和‘)’ :改变运算顺序。
    • 操作符的优先级:
      (1)单目-、!
      (2)*、/、%
      (3)+、-
      (4)<、<=、>、>=
      (5)==、!=
      (6)&&
      (7)||
    • 后缀表示法计算表达式:
      (1)顺序扫描表达式的每一项,若该项是操作数,则将其压栈;
      (2)若该项是操作符,则连续从栈中退出两个操作数,进行运算,并将计算结果重新压栈。
      (3)当表达式的所有项都扫描并处理完后,栈顶存放的就是最后的计算结果。
      (4)后缀表达式的顺序即为操作符优先级顺序,并且没有括号。
    • 从中缀式求后缀式:
      (1)设立暂存运算符的栈;
      (2)设表达式的结束符为“#”,予设运算符栈的栈底为“#”
      (3)若当前字符是操作数,则直接发送给后缀式;(后缀与前缀式操作数的顺序是相同的)
      (4)若当前运算符的优先数高于栈顶运算符,则进栈;否则,退出栈顶运算符发送给后缀式;
      (5)“(” 对它之前后的运算符起隔离作用,“)”为自左括弧开始的表达式的结束符。

猜你喜欢

转载自blog.csdn.net/Albert_Bolt/article/details/82356580