- 浏览: 601375 次
- 来自: ...
文章分类
最新评论
-
lgh1992314:
相同的元素呢
一种离散化方法 -
HelloSummerR:
圆心的位置是随机的,于是圆的部分会落到canvas外,那样就显 ...
HTML5 Canvas学习笔记(1)处理鼠标事件 -
hlstudio:
好久没见到sokuban了,这有个java版的,带源码,可以参 ...
求推箱子的最小步数(java) -
肖泽文:
太好了,谢谢你。。有中文注释!
HTML5 推箱子游戏过关演示动画 -
swm8023:
删除操作,将最后一个叶子节点插入后也有可能上浮吧
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
前缀表达式、中缀表达式和后缀表达式都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。
举例:
(3 + 4) × 5 - 6 就是中缀表达式
- × + 3 4 5 6 前缀表达式
3 4 + 5 × 6 - 后缀表达式
中缀表达式(中缀记法)
中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。
虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。
前缀表达式(前缀记法、波兰式)
前缀表达式的运算符位于操作数之前。
后缀表达式与前缀表达式类似,只是运算符位于操作数之后。
1、将中缀表达式转换为后缀表达式:
(1)当读到数字直接送至输出队列中;
(2)当读到运算符t时:
a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;
b.t进栈;
(3)读到左括号时总是将它压入栈中;
(4)读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号;
(5)中缀表达式全部读完后,若栈中仍有运算符,将其送到输出队列中。
2、 运用后缀表达式进行计算:
(1)建立一个栈S;
(2)从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X 运算符 Y”的形式计算机出结果,再压加栈S中;
(3)如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束。
下载源码:
举例:
(3 + 4) × 5 - 6 就是中缀表达式
- × + 3 4 5 6 前缀表达式
3 4 + 5 × 6 - 后缀表达式
中缀表达式(中缀记法)
中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。
虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。
前缀表达式(前缀记法、波兰式)
前缀表达式的运算符位于操作数之前。
后缀表达式与前缀表达式类似,只是运算符位于操作数之后。
1、将中缀表达式转换为后缀表达式:
(1)当读到数字直接送至输出队列中;
(2)当读到运算符t时:
a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;
b.t进栈;
(3)读到左括号时总是将它压入栈中;
(4)读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号;
(5)中缀表达式全部读完后,若栈中仍有运算符,将其送到输出队列中。
2、 运用后缀表达式进行计算:
(1)建立一个栈S;
(2)从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X 运算符 Y”的形式计算机出结果,再压加栈S中;
(3)如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束。
import java.util.Stack; import java.util.regex.*; public class StringToArithmetic { private StringToArithmetic() { } /** * 给出一个算术表达式,返回结果。 例如 (5+8+10)*1,返回23 * * @param string */ public static double stringToArithmetic(String string) { return suffixToArithmetic(infixToSuffix(string)); } /** * 中缀表达式转后缀表达式 * 只处理了+,-,*,/和括号,没有处理负号及其它运算符,也没对前缀表达式验证。 * 如要处理负号,可对表达式进行预转义处理,当下面条件成立时,将负号换成单目运算符"!" * infix.charAt[i]=='-'&&( i==0||infix.charAt[i-1]=='(') */ private static String infixToSuffix(String infix) { Stack<Character> stack = new Stack<Character>(); String suffix = ""; int length = infix.length(); for (int i = 0; i < length; i++) { Character temp; char c = infix.charAt(i); switch (c) { // 忽略空格 case ' ': break; // 碰到'(',push到栈 case '(': stack.push(c); break; // 碰到'+''-',将栈中所有运算符弹出,送到输出队列中 case '+': case '-': while (stack.size() != 0) { temp = stack.pop(); if (temp == '(') { stack.push('('); break; } suffix += " " + temp; } stack.push(c); suffix += " "; break; // 碰到'*''/',将栈中所有乘除运算符弹出,送到输出队列中 case '*': case '/': while (stack.size() != 0) { temp = stack.pop(); if (temp == '(' || temp == '+' || temp == '-') { stack.push(temp); break; } else { suffix += " " + temp; } } stack.push(c); suffix += " "; break; // 碰到右括号,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号 case ')': while (stack.size() != 0) { temp = stack.pop(); if (temp == '(') break; else suffix += " " + temp; } //suffix += " "; break; default: suffix += c; } } while (stack.size() != 0) suffix += " " + stack.pop(); return suffix; } public static void main(String args[]){ System.out.println(infixToSuffix("3+(2-5)*6/3")); System.out.println(stringToArithmetic("3+(2-5)*6/3")); } /** * 通过后缀表达式求出算术结果 * * @param String * postfix * @return double */ private static double suffixToArithmetic(String postfix) { Pattern pattern = Pattern.compile("\\d+||(\\d+\\.\\d+)"); // 匹配数字 String strings[] = postfix.split(" "); for (int i = 0; i < strings.length; i++) strings[i].trim(); Stack<Double> stack = new Stack<Double>(); for (int i = 0; i < strings.length; i++) { if (strings[i].equals("")) continue; if ((pattern.matcher(strings[i])).matches()) { stack.push(Double.parseDouble(strings[i])); } else { double y = stack.pop(); double x = stack.pop(); stack.push(caculate(x, y, strings[i])); } } return stack.pop(); } private static double caculate(double x, double y, String simble) { if (simble.trim().equals("+")) return x + y; if (simble.trim().equals("-")) return x - y; if (simble.trim().equals("*")) return x * y; if (simble.trim().equals("/")) return x / y; return 0; } }
下载源码:
- StringToArithmetic.zip (1.4 KB)
- 下载次数: 12
评论
1 楼
hesihua
2013-03-14
其中存在负数的时候似乎你这道程序通不过额
比如说表达式: -2 + 2 * 3 / 2 - 1
这个就会报错:
Exception in thread "main" java.util.EmptyStackException
at java.util.Stack.peek(Stack.java:85)
at java.util.Stack.pop(Stack.java:67)
at test1.Test.suffixToArithmetic(Test.java:100)
at test1.Test.main(Test.java:120)
比如说表达式: -2 + 2 * 3 / 2 - 1
这个就会报错:
Exception in thread "main" java.util.EmptyStackException
at java.util.Stack.peek(Stack.java:85)
at java.util.Stack.pop(Stack.java:67)
at test1.Test.suffixToArithmetic(Test.java:100)
at test1.Test.main(Test.java:120)
发表评论
-
图的练习题(有解答)
2012-12-27 22:23 26531. 填空题 ⑴ 设无向图G ... -
排序练习题
2012-12-27 16:46 1548一、选择题 1、以下序 ... -
2011计算机考研题
2012-12-20 12:19 1502初中的数学书上 ... -
2010计算机考研题:循环左移数组
2012-12-18 16:56 1507一、第一种方法,都想得到的。 static int[] L ... -
两种方法反转单链表
2012-12-17 20:38 1779/** * @author luochengcheng ... -
2009计算机考研题:查找链表中倒数第k个结点
2012-12-15 20:36 1389原理:两个指针先都指向头指针的下一节点,一个指针先走K-1 ... -
二叉搜索树练习 HDU3791
2012-11-25 19:52 1669一棵二叉查找树是按二叉树结构来组织的。这样的树可以用 ... -
上楼梯(深搜+回溯)JAVA解答
2012-11-12 15:28 1359N阶楼梯上楼问题:一次可以走两阶或一阶,请把所有行走方式打印出 ... -
深度优先搜索解组合问题(JAVA)
2012-11-10 12:17 1591题:输出从n不同元素中取m个的所有组合 下面程序使用了深度优先 ... -
图示克鲁斯卡尔构造最小生成树的过程
2012-11-06 11:29 1524... -
图示普里姆算法构造最小生成树的过程
2012-11-06 11:24 1443... -
由二叉树的后序遍历和中序遍历结果写出前序遍历
2012-10-07 17:32 1565【题目】 假设一棵二叉树的后序遍历序列为 DGJHEBIFCA ... -
树与二叉树:选择题50个
2012-08-23 16:33 3095单项选择题 (C) 1. 不含任何结点的空树 ... -
二叉树:填空题
2012-08-22 13:17 1876填空: 1. 由3个结点所 ... -
输出给定二叉树的嵌套括号表示(java)
2012-08-21 20:52 1832题:对于下图的二叉树,输出其嵌套括号表示 import j ... -
二叉树:选择题
2012-08-21 15:20 1228下面是有关二叉树的叙述,请判断正误(每小题1分,共10分) ( ... -
如何求完全二叉树的叶子节点数?
2012-08-20 22:21 2898设完全二叉树的高度为K: 题:设一棵完全二叉树有700个 ... -
列磁盘目录(深度优先和广度优先实现)
2012-08-12 00:01 1574有两种常用的方法可用来搜索图:即深度优先搜索和广度优先 ... -
线性表自测题一套及解答
2012-08-10 21:22 2199自测卷 ... -
数据结构概论自测题及答案一套
2012-08-09 21:54 1302一、填空题 ......................... ...
相关推荐
2. 利用后缀表达式计算表达式的值并输出结果。 3. 检查输入的中缀表达式是否合法。 实验内容主要包括以下几个模块: 1. 构建链栈:链栈是一种线性结构,用于存储数据,支持压栈和弹栈操作。 2. 输入数据:用户在...
c语言实现中缀表达式转后缀表达式并求得计算结果,用顺序栈结构。 当输入者输入错误信息的时候需要报错,并说明错误的种类。
### 自定义栈中缀表达式转换为后缀表达式并求值 #### 需求分析与背景 在计算机科学领域,将一个中缀表达式转换为后缀表达式是解决算术表达式求值问题的一种常用方法。通过这种方式可以避免括号带来的优先级问题,...
用户输入中缀表达式,程序输出后缀表达式并输出计算结果
利用C语言实现中缀表达式转化为后缀表达式!!利用栈。
按照惯例,算术表达式一般都写成中缀形式,即运算符总是出现在两个操作数之间,单目运算符除外),称为中缀表达式.编译系统对中缀表达式的处理方法是先把它转换为后后缀表达式.... (2) 根据后缀表达式计算表达式的值;
在计算机科学中,数据...总结来说,中缀表达式转后缀表达式是数据结构和算法中的一个经典问题,主要利用堆栈数据结构和运算符优先级规则。在C++中实现这一转换,可以提高计算效率,便于计算机解析和执行数学表达式。
本项目的目标是实现一个C++程序,它能够接收用户输入的中缀表达式,将其转换为后缀表达式,并计算出结果。这个过程涉及到以下几个关键知识点: 1. **优先级与结合性**:运算符有不同的优先级和结合性,例如乘法和除...
一个简单的算法,利用栈实现中缀表达式与后缀表达式的转换
本文将详细介绍如何使用Java语言实现中缀表达式到后缀表达式的转换,并进一步计算该表达式的值,特别支持多位数字和复杂运算,包括三角函数(正弦、余弦)、开方、幂和平方等。 #### 转换算法原理 中缀转后缀的...
C++的代码中缀表达式转后缀然后求值,数据结构方面的。
/*程序由本人编译,并且经过多次测试,正确无误!目前该转换算法只支持数字在0至9之间的+-*/四元运算转换.*/ /**************程序员信息 ***************东北大学*******************东大很厉害**************** ...
在项目“101544246张绪鹏--中缀转换为后缀表达式及其计算”中,开发者可能实现了一个完整的Java程序,该程序能够读取用户输入的中缀表达式,将其转换为后缀表达式,并根据后缀表达式计算出结果。程序可能包含以下几...
算法的设计围绕着如何正确地处理输入的中缀表达式,并将其转换为后缀表达式。具体步骤如下: 1. **读取中缀表达式**:从键盘读入中缀表达式,以字符`=`作为结束符。 2. **处理符号**: - 如果读入的是数字(字符0-...
这里我们关注的是将中缀表达式转换为后缀表达式(也称为逆波兰表示法),并进行求值。中缀表达式是我们日常数学计算中常用的格式,其中运算符位于操作数之间,例如 `2 + 3`。而后缀表达式则将运算符置于操作数之后,...
中缀表达式转后缀表达式的算法通常包含两个主要步骤:扫描和输出。首先,我们需要扫描整个中缀表达式,遇到数字时直接输出,遇到操作符时根据优先级与栈顶操作符进行比较,如果当前操作符优先级更高或者栈为空,则压...
Java中缀表达式求值 Java中缀表达式求值是一种常见的计算机算法,用于评估中缀表达式的值。中缀表达式是一种常见的数学表达式形式,但是在计算机中难以直接计算,因为它的运算符优先级和结合性规则使得计算变得复杂...
本篇文章将详细探讨如何通过C语言实现中缀表达式到后缀表达式转换的过程,并具体分析所涉及的关键算法与数据结构。 #### 中缀表达式与后缀表达式简介 - **中缀表达式**:我们日常使用的数学表达式,如 `3 + 4 * 2`...