栈的应用--对输入字符串表达式进行计算

在某些情况下,我们需要对输入字符串表达式进行计算,例如一个字符串为:“1 + 2 * 3”,我们需要计算出它的结果,在这里,我提供李春葆老师书中所写的《数据结构教程》里的算法,这种算法精密之处让我惊叹,特此分享。

首先这个表达式只允许存在加减乘除和括号,但这也足够复杂了。

计算机是无法识别加减乘除的优先计算顺序的,更何况还有括号,这是更难以解决的。这时候必须修改这个表达式,使计算机能够明白它的计算顺序,其实很简单,提供一个后缀表达式就行,什么是后缀表达式,把上面“1 + 2 * 3”改为后缀表达式就是“2 3 * 1 +”,这样可以利用一个简单的算法就可以算出结果,这也就是把先需要计算的数据和运算符排在前面,后需要计算的数据和运算符排在后面

怎么实现这个后缀表达式呢?这就是需要栈的应用。

我们首先创建一个栈,称这个栈为“运算栈”吧,压栈一个“=”,我们取这个“=”为0优先级(也就是最低优先级)。从字符串表达式中提取数据,如果是计算数据,则放在另一个表达式中(用来构成后缀表达式),每当遇到运算符的时候,就和左运算栈的栈顶运算符的优先级进行比较,如果外运算符(为了分别运算栈里的运算符,我称外面的运算符为外运算符)的优先级较高,这样就把这个外运算符压进运算栈中,相反如果外运算符的优先级较低,这样就把内运算符出栈,并将添加在上面说的后缀表达式中,最后,如果遍历完字符串表达式后,将运算栈的所有运算符出栈,添加在后缀表达式中,当然,“=”是不添加的。利用栈后进先出的特性,这样就把低优先级的运算符排在后面啦。

这里有两个问题:

1.如果遇到相等运算优先级的怎么办,如“+”遇到“+"或者“+”遇到“-”;

2.括号的优先级怎么处理。

首先解决第一个问题,遇到相等优先级的怎么办。我们知到,在现实中,相等优先级的运算符,谁在前面就谁先算,而在这里表现的是在运算栈里的运算符要先算,也就是,遇到相同优先级的运算符要将栈内运算符出栈添加在后缀表达式中,然后再将外运算符对栈顶的运算符进行优先级比较。这样也就解决了第一个问题。

第二个问题为括号的优先级要怎么处理。在现实计算中,括号里面的运算符都是要首先计算,这应该怎么处理呢,在李老师的书中提出了一个解决方法,让括号的优先级变化,让它在外运算符的优先级和在栈内的优先级不一样。我在这里详细的说一下,括号有左括号和右括号。当左括号在外运算符时,它的优先级必须最高,因为括号内的数据计算要隔离开外面的,这样,左括号在外运算符的优先级最高时,它就将会压栈,这样就和外面的运算符隔离开了。而左括号进入运算符后,它的优先级必须最低,这是因为如果保持最高优先级,这样另外的运算符跟它比较时,就无法入栈,只有最低优先级,才能保证括号内的运算符都能经过运算栈的处理。当右括号在外运算符的时候,它的优先级必须最低,这样就可以把经过运算栈处理过的运算符都能添加到后缀表达式中,当它跟运算栈内的左括号比较时,两个运算符都是最低优先级,这就尴尬了。我们在这里的处理应该是将左括号和右括号都抛弃掉,让它不存在在栈内和后缀表达式中,这样就和第一个问题的解决方法冲突了,因为在第一个问题解决方法中,相同优先级的运算符是应该讲运算栈内的运算符添加进后缀表达式,而外运算符和运算栈内的栈顶运算符比较。在这里,为了合理解决两个问题的方法,只有降低某些外运算符的优先级,这样外运算符的优先级低于运算栈内的运算符,可以使运算栈内的运算符添加进后缀表达式,但运算栈内左括号运算优先级应该和外运算符中的右括号优先级一样,这样就可以使两个优先级相同的左括号和右括号被抛弃。下面是李老师书中提供的运算符优先级:

运算符               =             (               +           -          *         /          )

内运算符            0               1               3            3         5         5         6

外运算符            0               6                2            2         4          4        1

提供一个伪算法:

ch为字符串表达式中的字符。

while(ch != 0)

{

       if(ch为运算数据)

      {

                 while ( ch为运算数据)

                 {

                        将ch添加进后缀表达式; 

                         ch++;

                  }

        }

          else

           {

                      switch(ch和运算栈的栈顶运算符优先级)

                     {

                          case  小 :将ch压进运算栈中;

                                            ch++;

                                            break;

                          case 相等:将外运算符和栈顶运算符都抛弃掉;

                                            ch++;

                                             break;

                           case  大:栈顶运算符添加进后缀表达式;

                                           break;

                       }

           }
}

最后将栈中的所有运算符出栈添加在后缀表达式中,‘=’不用添加。

这篇文章的Demo  

GitHub - suancaiAmour/Data-Struct: 数据结构

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

推荐阅读更多精彩内容

  • 版权声明:本文源自简书tianma,转载请务必注明出处: http://www.jianshu.com/p/a0d...
    tianma阅读 2,016评论 0 5
  • 栈的规则 先进后出。如:依次入栈顺序为:A,B,C,D;怎出栈顺序为:D,C,B,A . 二叉树和表达式 表达式的...
    zhangivon阅读 807评论 0 0
  • 栈模型## 栈(Stack)是限制插入和删除只能在一个位子上进行的表,该位子是表的末端,叫做栈的顶(top)。对栈...
    kylinxiang阅读 1,640评论 0 1
  • 夜半醉里听风,甚是从容。 鸡鸣梦里花落,沾衣而过。 平旦日月相饶,熹微悄悄。 日出轻红似羞,霞光柔柔。 食时一双瓷...
    当初不该下凡阅读 467评论 4 7
  • RongCZ阅读 291评论 12 12