数据结构之——栈

栈的规则

先进后出。如:依次入栈顺序为:A,B,C,D;怎出栈顺序为:D,C,B,A .

二叉树和表达式

  • 表达式的二叉树展示方式
    例如:(a+b×(c-d))-e/f,我们平时数学中表达式,其实就是所谓的中缀表达式表达式用树形来表示,如图所示。运算符在树中放在非终端结点的位置上,操作数放在叶子结点处

表达式二叉树

当我们对此二叉树进行先序、中序和后序遍历后,便可得到表达式的前缀、中缀和后缀书写形式:
前缀:-+a*b-cd/ef
中缀:a+b*c-d-e/f
后缀:abcd-*+ef/-
一般的解法,可以考虑将中缀表达式转换成二叉树,在求值。

  • 前、中、后缀表达式
    举例:
    (3 + 4) × 5 - 6 就是中缀表达式
    - × + 3 4 5 6 前缀表达式
    3 4 + 5 × 6 - 后缀表达式

  • 中缀表达式(中缀记法)
    直接按照数学逻辑求值就行了。个人感觉中缀表达式最容器转换成二叉树了,因为树的特点是:根节点为运算操作符,而非根叶子节点为操作数,根据这个规则和表达式的优先规则切分成根、左右子树就可以了。

  • 前缀表达式(前缀记法、波兰式)
    特点:前缀表达式的运算符位于操作数之前。

    • 前缀表达式的计算机求值:
      从右至左(其实很简单记住扫描方向,就是从第一个操作数所在的那一端开始扫描)扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
      例如前缀表达式“- × + 3 4 5 6”:
      (1) 从右至左扫描,将6、5、4、3压入堆栈;
      (2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈;
      (3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈;
      (4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果

    • 使用栈,将中缀表达式转换为前缀表达式
      遵循以下步骤:
      (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
      (2) 从右至左(和计算求值时的扫描方向是一致的)扫描中缀表达式;
      (3) 遇到操作数时,将其压入S2;
      (4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
      (4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;
      (4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;(意思是栈顶的运算符优先级时刻至少要高于前面入栈的)
      (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
      (5) 遇到括号时:
      (5-1) 如果是右括号“)”,则直接压入S1;
      (5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃;
      (6) 重复步骤(2)至(5),直到表达式的最左边;
      (7) 将S1中剩余的运算符依次弹出并压入S2;
      (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。
      下面举例演示一下,省的画图了,就借用一下网上现成的吧,谢谢这位大神。
      例如,将中缀表达1+((2+3)×4)-5转换为前缀表达式的过程如下(最后S2出栈,结果为- + 1 × + 2 3 4 5):

使用栈求前缀表达式
  • 后缀表达式(后缀记法、逆波兰式)
    特点:后缀表达式与前缀表达式类似,只是运算符位于操作数之后。

    • 后缀表达式的计算机求值
      与前缀表达式求值方式差不多,只是扫描方向相反,从左到右开始扫描。

    • 将中缀表达式转换为后缀表达式
      与转换为前缀表达式相似,遵循以下步骤:
      (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
      (2) 从左至右(再提一次,此时操作数在左边)扫描中缀表达式;
      (3) 遇到操作数时,将其压入S2;
      (4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
      (4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
      (4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况)
      (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
      (5) 遇到括号时:
      (5-1) 如果是左括号“(”,则直接压入S1;
      (5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃;
      (6) 重复步骤(2)至(5),直到表达式的最右边;
      (7) 将S1中剩余的运算符依次弹出并压入S2;
      (8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)。
      例如,将中缀表达1+((2+3)×4)-5转换为后缀表达式的过程如下(结果为1 2 3 + 4 × + 5 -(注意S2出栈后需要逆序输出)。):

使用栈求后缀表达式

根据表达式反推二叉树

  • 中缀表达式求二叉树:
    其实记住运算符为根节点,然后把操作数作为左右叶子节点,根据二叉树的中序遍历,构建一棵子树,不断自下而上,就能复原了。举例(3 + 4) × 5 - 6(画了个丑图):

    中缀表达式转二叉树
  • 后缀表达式求二叉树:
    思路是一样的,拿两个操作数和一个运算符,不断自底向上组建二叉树。举例:3 4 + 5 × 6 - 后缀表达式。(写字太丑了,我自己都看不下去了。。。。。)

    后缀表达式求二叉树

  • 前缀表达式转二叉树
    抱歉,我想不出来。。。。

两个栈共用存储空间

栈满条件:栈1向上增长,栈2向下增长,显然当top[1]和top[2]相邻时,栈满。

栈满

栈和堆

栈区(stack)— 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
堆区(heap) — 一般由程序员分配释放, new, malloc之类的,若程序员不释放,程序结束时可能由OS回收 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容