栈和队列4 – 数据结构和算法26
2015-11-16 17:23
423 查看
栈和队列4
让编程改变世界Change the world by program
栈的链式存储结构
讲完了栈的顺序存储结构,也给大家结合了一些例题演练,相信大家对栈再也不陌生了吧?现在我们来看下栈的链式存储结构,简称栈链。(通常我们用的都是栈的顺序存储结构存储,链式存储我们作为一个知识点,大家知道就好!)
栈因为只是栈顶来做插入和删除操作,所以比较好的方法就是将栈顶放在单链表的头部,栈顶指针和单链表的头指针合二为一。
No pic you say a J8……
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/16/aaf00a8829947c85eec91b8127fb37c1.jpg)
栈链
teypedef struct StackNode { ElemType data; // 存放栈的数据 struct StackNode *next; } StackNode, *LinkStackPtr; teypedef struct LinkStack { LinkStackPrt top; // top指针 int count; // 栈元素计数器 }
进栈操作
对于栈链的Push操作,假设元素值为e的新结点是s,top为栈顶指针,我们得到如下代码:Status Push(LinkStack *s, ElemType e) { LinkStackPtr p = (LinkStackPtr) malloc (sizeof(StackNode)); p->data = e; p->next = s->top; s->top = p; s->count++; return OK; }
出栈操作
至于链栈的出战Pop操作,假设变量p用来存储要删除的栈顶结点,将栈顶指针下移一位,最后释放p即可。Status Pop(LinkStack *s, ElemType *e) { LinkStackPtr p; if( StackEmpty(*s) ) // 判断是否为空栈 return ERROR; *e = s->top->data; p = s->top; s->top = s->top->next; free(p); s->count--; return OK; }
终极实践
在讲解这道例题的时候,请允许小甲鱼花一点点的时间对小学时候的数学老师进行感谢,嗯,谢谢您,让我学会如何计算以下这道表达式,并且认为它十分简单:(1-2)*(4+5)人类早就熟悉这种中缀表达式的计算方式,随便拉一个小朋友过来,给他一颗糖,他会马上告诉你这个结果应该是等于-9,因为括号里边的要先进行计算。
但是计算机不喜欢了,因为我们有小括号中括号大括号,还允许一个嵌套一个,这样子计算机就要进行很多次if判断才行决定哪里先计算。
逆波兰表达式
后来,在20世纪三十年代,波兰逻辑学家Jan.Lukasiewicz不知道是像牛顿一样被苹果砸到脑袋而想到万有引力原理,或者还是像阿基米德泡在浴缸里突发奇想给皇冠是否纯金做验证,总之他也是灵感闪现了,然后发明了一种不需要括号的后缀表达式,我们通常把它称为逆波兰表达式(RPN) 。很多鱼油好奇为什么他发明的东西是以他的国籍而不是以他的名字命名的呢?这也告诉我们,想要流芳百世,名字还得起得朗朗上口才行。
我们先来看看,对于(1-2)*(4+5),如果用逆波兰表示法,应该是这样:1 2 – 4 5 + *
这种方式敢情我们人类是不大好接受的了,不过对于计算机来说,那可是喜爱至极。
因为只需要利用栈的特点,就可以将这种后缀表达式的性能发挥到极致。
解析来就让小甲鱼图文并茂的解释一下吧!
No pic you say a J8……
数字1和2进栈,遇到减号运算符则弹出两个元素进行运算并把结果入栈。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/16/c02b6c6c019cd623b337df93c14c9eb6.jpg)
逆波兰计算法
4和5入栈,遇到加号运算符,4和5弹出栈,相加后将结果9入栈。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/16/290e52d433e1dc76baccac7f122fea97.jpg)
逆波兰计算法
然后又遇到乘法运算符,将9和-1弹出栈进行乘法计算,此时栈空并无数据压栈,-9为最终运算结果!
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/16/e4916dc88dfc1f5ff240137a9ab01506.jpg)
逆波兰计算法
转自:http://blog.fishc.com/2078.html
相关文章推荐
- 栈和队列5|逆波兰计算器 – 数据结构和算法27
- 栈和队列3|进制转换 – 数据结构和算法25
- 栈和队列1 – 数据结构和算法23
- 栈和队列2 – 数据结构和算法24
- 线性表17 – 数据结构和算法22
- 线性表16:双向链表 – 数据结构和算法21
- 线性表15|魔术师发牌问题和拉丁方阵 – 数据结构和算法20
- 项目4--利用遍历思想求解图问题
- 线性表14 – 数据结构和算法19
- 数据结构之自建算法库——图及其存储结构(邻接矩阵、邻接表)
- 线性表13|约瑟夫问题 – 数据结构和算法18
- 线性表12|循环链表 – 数据结构和算法17
- 线性表11|单链表小结:腾讯面试题 – 数据结构和算法16
- 线性表10 – 数据结构和算法15
- 线性表8 – 数据结构和算法13
- 线性表9 – 数据结构和算法14
- 线性表7 – 数据结构和算法12
- 线性表6 – 数据结构和算法11
- 线性表5 – 数据结构和算法10
- 线性表4 – 数据结构和算法09