栈(stack)又称堆栈

是限定只在表尾进行插 入或删除操作的线性表。 栈S = ( a1 , a2 , …,an ) 是按a1 , a2 , …,an次序进栈的,a1为栈底元素,an 为栈顶元素。

栈的修改是按先进后出原则进行的,所以栈又称 后进先出(Last In First Out)的线性表。简称LIFO结 构。先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。对栈的插入与删除操作中,不需要改变栈底指针。

栈的存储:

顺序:

  • top = -1 : 栈空
  • top =StackMaxSize-1 : 栈满
  • 压栈 : top++,然后再赋值
  • 出栈 : 先取出栈顶元素,再 top - -
  • 即:插入删除是在顺序表的表尾进行的
  • 时间复杂度 :O(1)

 链式存储:

栈的应用:

1):反序输出 

2):括号匹配 (左括弧入栈,右括弧出栈)

         假设在表达式中 ([]())或[([ ][ ])] 等为正确的格式, [( ])或([( ))或 (( )]) 均为不正确的格式。

        凡出现左括弧,则进栈; 凡出现右括弧,首先检查栈是否空 若栈空,则表明该“右括弧”多余 否则和栈顶元素比较, 若相匹配,则“左括弧出栈” 否则表明不匹配          表达式检验结束时, 若栈空,则表明表达式中匹配正确 否则表明“左括弧”有余

3)数制转换:余数入栈,最后出栈

 

4):算术表达式的计算:

算术表达式的两种表示S1 第一个操作数,OP 运算符 S2 第二个操作数

中缀表达式:S1 + OP + S2 为中缀表示法

后缀表达式(逆波兰式):S1 + S2 + OP 为后缀表示法

如何从后缀式求值?a b × c d e / - f ×  + 最终结果为:a×b+(c-d/e)×f

从左向右扫描,遇到数字时,将数字压入栈,遇到运算符时候,把栈内前两个数字弹出,先弹出的数字放在运算符后面,然后进行相应运算,并将计算结果入栈。重复直到表达式最右端。

例:后缀表达式是34+5*6- (从左向右扫描)

a) 将数字3,4依次入栈;

b) 遇见运算符+,依次弹出4,3,计算3+4=7,将7入栈继续扫描;

c) 将5入栈;

d) 遇见运算符*,依次弹出5,7,计算7*5=35,将35入栈继续扫描;

e) 将6入栈;

f) 遇见运算符-,依次弹出两个6,35,计算35-6=29,将29入栈继续扫描

扩展:

例1:若已知一个栈的进栈序列是1,2,3,…,n,元素出栈后马上进入队列, 已知队列输出序列为p1,p2,p3,…,pn, 1=3,试讨论p2的可能性

答案:一定不是1,可能为2,也可能为其他值

例2:设栈S和队列Q的初始状态为空,元素a1,a2,a3,a4,a5,a6,a7,a8依次通过栈S 一个元素出栈后立即进入队列Q,若8 元素出队列的次序是 a3,a6,a7,a5,a8,a4,a2,a1,则栈S的容量至

少应该是多少?(即至少应该容纳多少个元素?)

答案:5

posted @ 2019-10-21 14:43  暖暖-木木  阅读(278)  评论(0编辑  收藏  举报