逆波兰表达式:
  逆波兰表达式又叫后缀表达式。它是由相应的语法树的后序遍历的结果得到的。
例:5 - 8*(6 + 7) + 9 / 4:
其中缀表达式为:5 - 8 * 6 + 7 + 9 / 4
其语法树如下:
  
因此根据语法树可以得出他后序遍历(后缀表达式)为:
5 8 6 7 + * - 9 4 / +

这样就实现了中缀表达式到后缀表达式的转换。
同样的也可以得出他的前序遍历(前缀表达式也称波兰表达式):
 + - 5 * 8 + 6 7 / 9 4

逆波兰表达式计算实现原理:
1.首先当遇到运算操作数时将其进行push操作;

2.当遇到操作符是将此时的栈pop两次,先取出的栈顶为右操作数;

3.执行此方法到整个数组遍历完。

实现算法如下:

void CalFunction(SqStack *S,char str[])
{/*实现浮点型数据后缀表达式的加减乘除*/Elemtype number,e,d;char arr[MAXBUFFER];int i=0,j=0;InitStack(S);while(str[i]!='\0'){while(isdigit(str[i])||str[i]=='.')  //过滤数字{arr[j++]=str[i++];arr[j]='\0';if( j >= MAXBUFFER ){printf("输入单个数据过大!\n");return ;}if(str[i]==' '){number=atof(arr);    //利用atof函数将数字字符串转化为double型数据PushStack(S,number); //将转换的数进行压栈j=0;                 //这里不要忘记将j重新初始化进行下个数据的转化break;}}/*如果遇到操作运算符则,弹出两个数据进行运算,然后将得出的结果重新入栈*/switch(str[i]){case '+':PopStack(S,&e);PopStack(S,&d);PushStack(S,d+e);break;case '-':PopStack(S,&e);PopStack(S,&d);PushStack(S,d-e);break;case '*':PopStack(S,&e);PopStack(S,&d);PushStack(S,d*e);break;case '/':PopStack(S,&e);PopStack(S,&d);if(e == 0){printf("输入出错,分母为零!\n");return ;}PushStack(S,d/e);break;}i++;    //继续遍历直到遍历字符串结束}PopStack(S,&e);printf("计算结果为:%lf",e);
}

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<ctype.h>#define INITSIZE  20
#define INCREMENT 10
#define MAXBUFFER 10
#define LEN   sizeof(Elemtype)/*栈的动态分配顺序存储结构*/
typedef double Elemtype;
typedef struct{Elemtype *base;Elemtype *top;int StackSize;
}SqStack;void InitStack(SqStack *S)
{S->base=(Elemtype*)malloc(LEN*INITSIZE);assert(S->base != NULL);S->top=S->base;S->StackSize=INITSIZE;
}void PushStack(SqStack *S,Elemtype e)
{if(S->top - S->base >= S->StackSize){S->base=(Elemtype*)realloc(S->base,(S->StackSize+INCREMENT)*LEN);assert(S->base !=NULL);S->top=S->base+S->StackSize;S->StackSize+=INCREMENT;}*S->top =e;S->top++;
}void PopStack(SqStack *S,Elemtype *e)
{*e=*--S->top;
}void CalFunction(SqStack *S,char str[])
{Elemtype number,e,d;char arr[MAXBUFFER];int i=0,j=0;InitStack(S);while(str[i]!='\0'){while(isdigit(str[i])||str[i]=='.')  //过滤数字{arr[j++]=str[i++];arr[j]='\0';if( j >= MAXBUFFER ){printf("输入单个数据过大!\n");return ;}if(str[i]==' '){number=atof(arr);    //利用atof函数将数字字符转化为double型数据PushStack(S,number); //将转换的数进行压栈j=0;break;}}switch(str[i]){case '+':PopStack(S,&e);PopStack(S,&d);PushStack(S,d+e);break;case '-':PopStack(S,&e);PopStack(S,&d);PushStack(S,d-e);break;case '*':PopStack(S,&e);PopStack(S,&d);PushStack(S,d*e);break;case '/':PopStack(S,&e);PopStack(S,&d);if(e == 0){printf("输入出错,分母为零!\n");return ;}PushStack(S,d/e);break;}i++;   }PopStack(S,&e);printf("计算结果为:%lf",e);
}int main()
{char str[100];SqStack S;printf("请按逆波兰表达式输入数据,每个数据之间用空格隔开:");gets(str);CalFunction(&S,str);return 0;
}// 检测用例 5 - (6 + 7) * 8 + 9 / 4// 输入:5 8 6 7 + * - 9 4 / + # // 输出: - 96.750000

运行效果截图如下:

利用栈实现对后缀表达式(逆波兰表达式)的求解(C代码实现)相关推荐

  1. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  2. 数据结构:前缀,中缀,后缀表达式(逆波兰表达式)

    前缀表达式(波兰表达式) 前缀表达式的运算符位于操作数之前. 比如 (1+2)*3-4  对应的前缀表达式就是: - * + 1 2 3 4 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,就 ...

  3. 前缀(波兰表达式) 中缀 后缀(逆波兰表达式)

    前缀.中缀.后缀表达式(逆波兰表达式) 本文转自https://www.cnblogs.com/chensongxian/p/7059802.html 介绍 前缀表达式.中缀表达式.后缀表达式都是四则 ...

  4. 【Leetcode栈与队列】150. 逆波兰表达式求值(后缀表达式求值,看作对对碰游戏)

    文章目录 Leetcode150 1.问题描述 2.解决方案 3.计算机的思考方式 Leetcode150 1.问题描述 2.解决方案 1.逆波兰表达式优点 2.逆波兰表达式相当于是二叉树中的后序遍历 ...

  5. 数据结构:后缀表达式(逆波兰表达式)

    逆波兰表达式计算 package com.atchina.stack;import java.util.ArrayList; import java.util.List; import java.ut ...

  6. 四则运算表达式 逆波兰表达式

    感觉是一块比较偏门的东西,特此记录下: 逆波兰表达式: 或者叫后缀表达式,我们原先用的一直都是中缀表达式,但是因为如果表达式过长,计算机计算起来不方便.需要先遍历一边,找出其中的()进行优先计算,如果 ...

  7. 数据结构-栈应用之逆波兰表达式(后缀表达式)

    逆波兰表达式含义我就不做赘述了,摘自百科上的一段话: 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示.波兰逻辑学家J.Lukas ...

  8. 逆波兰表达式[栈 C 语言 实现]

    逆波兰表达式 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示 ...

  9. 数组结构与算法-036-042 前中后缀表达式-逆波兰计算器

    036 前缀 中缀 后缀(逆波兰表达式)表达式 前缀表达式 前缀表达式(波兰表达式) 前缀表达式又称波兰表达式,前缀表达式的运算符位于操作数之前 举例说明:(3 + 4) * 5 -6 对应的前缀表达 ...

  10. 栈、波兰表达式、逆波兰表达式

    一.栈的简介及其基本操作 栈的介绍 1)栈的英文为(stack) 2)栈是一个先入后出(FILO-First In Last Out)的有序列表 3)栈(stack)是限制线性表中元素的插入和删除只能 ...

最新文章

  1. python修改ppt的字体和颜色_使用python-pptx包批量修改ppt格式的实现
  2. 查询局域网内在线电脑IP
  3. Python基础知识-优雅的with as语句
  4. SpringBoot 自动开启事务原理
  5. 三十二楼层选几层最好_买房楼层怎么选?建筑学家建议:一栋楼不管几层,最好避开这3层...
  6. sis地址获取器_TencentOS tiny深度源码分析(2)—— 调度器
  7. Map 参数按Key重新排序,重组成String
  8. 如何吧家庭网络从计算机去掉,3个简单电脑、路由器设置,迅速解决网络瓶颈提高家庭网络速度...
  9. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_1_线程安全问题的概述...
  10. Spring JtaTransactionManager事务管理
  11. 读书笔记_打开量化投资的黑箱08
  12. 简述软件测试自动化的作用,什么是自动化测试?了解一下~
  13. 【Python】一元线性回归的分析
  14. UE4 Slate二 用UMG思想去理解Slate+Slate编码
  15. Android游戏集成豌豆荚支付
  16. 1分钟学会便捷绘制跨职能流程图
  17. 宇宙大爆炸前后发生的事件
  18. 超详细,win7虚拟机安装
  19. xps 转 pdf android版,OakDoc XPS to PDF Converter(XPS文件转PDF格式工具)V2.2 正式版
  20. Mac地址自动生成器核心处理类

热门文章

  1. 【问题解决】QT报错 undefined reference to `__imp__ZN11QSerialPortD1Ev‘
  2. 使用beautifulsoup4,爬取一波贴吧的表情包
  3. 怎么检查APP是否存在用户信息数据泄露漏洞
  4. pbs 写matlab作业,pbs提交作业.pdf
  5. 在字节跳动的实习经历分享 | 万字求职指南
  6. DSP 增强型脉宽调制ePWM
  7. 精确率、准确率、召回率、ROC、AUC的概念,计算方式和代码实现
  8. 彻底清除 mplay.com与mplay.exe病毒
  9. 2018 网易校招题目
  10. 抖音图文人物故事音乐任务实操短视频运营课程,手把手教你玩转音乐任务