利用栈实现对后缀表达式(逆波兰表达式)的求解(C代码实现)
逆波兰表达式:
逆波兰表达式又叫后缀表达式。它是由相应的语法树的后序遍历的结果得到的。
例: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)*3-4 对应的前缀表达式就是: - * + 1 2 3 4 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,就 ...
- 前缀(波兰表达式) 中缀 后缀(逆波兰表达式)
前缀.中缀.后缀表达式(逆波兰表达式) 本文转自https://www.cnblogs.com/chensongxian/p/7059802.html 介绍 前缀表达式.中缀表达式.后缀表达式都是四则 ...
- 【Leetcode栈与队列】150. 逆波兰表达式求值(后缀表达式求值,看作对对碰游戏)
文章目录 Leetcode150 1.问题描述 2.解决方案 3.计算机的思考方式 Leetcode150 1.问题描述 2.解决方案 1.逆波兰表达式优点 2.逆波兰表达式相当于是二叉树中的后序遍历 ...
- 数据结构:后缀表达式(逆波兰表达式)
逆波兰表达式计算 package com.atchina.stack;import java.util.ArrayList; import java.util.List; import java.ut ...
- 四则运算表达式 逆波兰表达式
感觉是一块比较偏门的东西,特此记录下: 逆波兰表达式: 或者叫后缀表达式,我们原先用的一直都是中缀表达式,但是因为如果表达式过长,计算机计算起来不方便.需要先遍历一边,找出其中的()进行优先计算,如果 ...
- 数据结构-栈应用之逆波兰表达式(后缀表达式)
逆波兰表达式含义我就不做赘述了,摘自百科上的一段话: 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示.波兰逻辑学家J.Lukas ...
- 逆波兰表达式[栈 C 语言 实现]
逆波兰表达式 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示 ...
- 数组结构与算法-036-042 前中后缀表达式-逆波兰计算器
036 前缀 中缀 后缀(逆波兰表达式)表达式 前缀表达式 前缀表达式(波兰表达式) 前缀表达式又称波兰表达式,前缀表达式的运算符位于操作数之前 举例说明:(3 + 4) * 5 -6 对应的前缀表达 ...
- 栈、波兰表达式、逆波兰表达式
一.栈的简介及其基本操作 栈的介绍 1)栈的英文为(stack) 2)栈是一个先入后出(FILO-First In Last Out)的有序列表 3)栈(stack)是限制线性表中元素的插入和删除只能 ...
最新文章
- python修改ppt的字体和颜色_使用python-pptx包批量修改ppt格式的实现
- 查询局域网内在线电脑IP
- Python基础知识-优雅的with as语句
- SpringBoot 自动开启事务原理
- 三十二楼层选几层最好_买房楼层怎么选?建筑学家建议:一栋楼不管几层,最好避开这3层...
- sis地址获取器_TencentOS tiny深度源码分析(2)—— 调度器
- Map 参数按Key重新排序,重组成String
- 如何吧家庭网络从计算机去掉,3个简单电脑、路由器设置,迅速解决网络瓶颈提高家庭网络速度...
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_1_线程安全问题的概述...
- Spring JtaTransactionManager事务管理
- 读书笔记_打开量化投资的黑箱08
- 简述软件测试自动化的作用,什么是自动化测试?了解一下~
- 【Python】一元线性回归的分析
- UE4 Slate二 用UMG思想去理解Slate+Slate编码
- Android游戏集成豌豆荚支付
- 1分钟学会便捷绘制跨职能流程图
- 宇宙大爆炸前后发生的事件
- 超详细,win7虚拟机安装
- xps 转 pdf android版,OakDoc XPS to PDF Converter(XPS文件转PDF格式工具)V2.2 正式版
- Mac地址自动生成器核心处理类
热门文章
- 【问题解决】QT报错 undefined reference to `__imp__ZN11QSerialPortD1Ev‘
- 使用beautifulsoup4,爬取一波贴吧的表情包
- 怎么检查APP是否存在用户信息数据泄露漏洞
- pbs 写matlab作业,pbs提交作业.pdf
- 在字节跳动的实习经历分享 | 万字求职指南
- DSP 增强型脉宽调制ePWM
- 精确率、准确率、召回率、ROC、AUC的概念,计算方式和代码实现
- 彻底清除 mplay.com与mplay.exe病毒
- 2018 网易校招题目
- 抖音图文人物故事音乐任务实操短视频运营课程,手把手教你玩转音乐任务