逆波兰算法,实现一个四则运算计算器

  计算器分两步实现:

  1。将常规表达式(中缀表达式)处理成后缀表达式。

  2。计算后缀表达式。

  第一步:  中缀如:1+(2*3)-4/2,转化为后缀123*+42/- 。  

 规则:从左往右遍历中缀表达式,如果是数字,就直接拿出来,如果是符号,那么判断优先级,如果当前符号(包括右括号)的优先级不大于栈顶符号的优先级,那么依次出栈,直到优先级不满足(如果是右括号,那么直到出栈到左括号,后缀表达式里不需要左右括号),然后把该符号入栈。优先级高的直接入栈。如此直到搞定。

  第二步: 计算后缀表达式。

 规则:从左往右遍历后缀表达式,如果是数字,直接入栈,如果是符号,那么弹出栈顶的两个数字,和这个符号运算。运算结果再入栈。直到算完。

时间: 2024-10-23 04:51:14

逆波兰算法,实现一个四则运算计算器的相关文章

【算法】表达式求值--逆波兰算法介绍

逆波兰算法介绍 假定给定一个只 包含 加.减.乘.除,和括号的算术表达式,你怎么编写程序计算出其结果. 问题是:在表达式中,括号,以及括号的多层嵌套 的使用,运算符的优先级不同等因素,使得一个算术表达式在计算时,运算顺序往往因表达式的内容而定,不具规律性. 这样很难编写出统一的计算指令.使用逆波兰算法可以轻松解决.他的核心思想是将普通的中缀表达式转换为后缀表达式. 转换为后缀表达式的好处是:1.去除原来表达式中的括号,因为括号只指示运算顺序,不是完成计算必须的元素.2.使得运算顺序有规律可寻,计

逆波兰算法

这里先给出运算符的优先级,表中0级优先级最低,7级最高,如下: 优先级 0 1 2 3   4       5     6         7   运算符 #  ( , +- */      @~     !%^   ) 说明 第一.生成逆波兰表达式 首先构建一个存储器,另一个符号栈,存储器是从左向右储存数据,而符号栈则遵守后进先出的原则,计算表达式按从左至右的顺序扫描. * 读入一个数据(重点注意:数值与函数名非单个字符,需要做判断处理) 1. 如果是左单目运算符或者函数名,直接入符号栈:比如

利用栈实现逆波兰算法

1.逆波兰表达式? 在我们的普遍认知中,计算的优先级总是和()相关,形如(1+2)*(3+4)这样的式子,我们看起来十分的清晰明了,但对计算机来说,它会进行很多次的判断来确定一个运算的优先级.于是在很久很久之前就有一个人发现,如果我们将上述算式写成形如1 2 + 3 4 + *的形式,计算机判断起来会显得格外的快,效率也会更高,然而它的实现原理是什么样的呢. 2.算法分析 经过观察,我们发现该算式将参数放在前面,运算操作符放在两个要进行计算的参数之后,我们可以得出这样的思路:每次我们将拿到的数据

从中序表达式到逆序表达式(逆波兰式)(四则运算表达式求值)

本份代码需要两个栈.一个是符号栈,一个是数字栈. 输入中序表达式如9+(3-1)*3+10/2# #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> #define max 100 char ex[max]; /*存储后序表达式*/ /*函数功能:将中序表达式转化为后序表达式*/ void trans() { char str[max]; /*表达式字符串*/ char stack[max]; /*运

JS做一个四则运算计算器

用JS做一个简单的网页计算器如上图所示,只进行简单的加减乘除运算 <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>计数器</title></head><body>    <input type="text" name="text"

逆波兰算法~简单理解栈

#include <iostream> #include <stack> #include <string> using namespace std; int main() { stack<int> st;//初始化栈 string s; cin>>s; int x,y; for(int i=0;i<s.size();i++) { if(s[i]=='+') { x=st.top();//返回头部值 st.pop();//弹出 y=st.t

【华为OJ】逆波兰

描述:  逆波兰记法中,操作符置于操作数的后面.例如表达"三加四"时,写作"3 4 +",而不是"3 + 4".如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的"3 - 4 + 5"在逆波 兰记法中写作3 4 - 5 +":先3减去4,再加上5.使用逆波兰记法的一个好处是不需要使用括号. 请编写Java函数计算逆波兰表达式的结果. 输入一个逆波兰表达式, 1.操作数类型为正的double数,符合ja

栈的应用---逆波兰表达式

学习了栈后,那么栈有什么用呢?下面就举一个经典的例题---逆波兰表达式的求解. 首先呢,什么是逆波兰表达式呢? 逆波兰表达式呢,就是先是操作数,后操作符. 所有的表达式都可以写成逆波兰表示式的形式. 假如现有一逆波兰表达式,那么如何求它的解呢?我们的栈就要派上用场喽! 思路: 如果遇到操作数,就将其放入栈中,如果遇到操作符,则取出两个操作数进行运算.将其结果压入栈中.直到遇到最后一个操作符运算后压入栈中,出栈即为表达式的结果. 逆波兰表达式有两种类型:操作数,操作符. 可将逆波兰表达式看成一个C

逆波兰表达式的实现

一般情况下表达式是由操作数和运算符组成,例如算数表达式中通常将运算符放在两个操作数中间,譬如a+b的形式,这种形式称为中缀表达式,那么问题来了,是否有后缀表达,前缀表达式呢??? 对,没错,这些后缀表达,前缀表达式都是由波兰数学家Jan Lukasiewicz提出来的 把运算符写在操作数之前,称为波兰表达式(Polish Expression)或前缀表达式(Prefix Expression),如+AB: 把运算符写在操作数之后,称为逆波兰表达式(Reverse Polish Expressio