中缀表达式转化为后缀表达式

后缀表达式

逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3 - 4 * 5”与“(3 - 4)*5”不相同,但后缀记法中前者写做“3 4 5 * -”,无歧义地表示“3 (4 5 *) ?”;后者写做“3 4 - 5 *”。

来源: https://zh.wikipedia.org/wiki/%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E7%A4%BA%E6%B3%95

调度场算法

  • 当还有记号可以读取时
    • 读取一个记号
      • 表示一个数字,添加到输出队列中
      • 表示一个函数,压入栈中
      • 一个函数参数的分隔符(,)
        • 从占中不断的弹出操作符,并且放入输出队列中去,知道栈顶部的元素为一个左括号为止。
          • 如果一直没有遇到左括号
            • 分隔符放错了位置
            • 括号不匹配
      • 一个操作符,记做O1
        • 只要存在另一个O2的操作符位于栈的顶端
          • 如果O1是左结合性的并且它的运算符优先级要小于或等于O2的优先级,或者如果O1是右结合性的并且它的运算符优先级比O2的低,那么O2从栈顶弹出并且放入输出队列中(循环直至以上条件不满足为止,如果O1左结合性,直到遇上优先级比O1低的,停止,如果O1右结合性,直到遇上优先级比O1相等的或低的)
          • 然后,将O1压入栈的顶端
      • 左括号
        • 压入栈中
      • 右括号
        • 从栈当中不断的弹出操作符并且放入输出队列中,直到弹出的元素为左括号为止
        • 将左括号从栈的顶部弹出,但并不放入输出队列中去
        • 如果在找到一个左括号之前,栈就已经弹出了所有元素,那么久表明在表达式中存在不匹配的括号
  • 当再没有记号可以读取时
    • 如果在栈中还有操作符
      • 如果此时位于站顶端的操作符是一个括号,那么就表示在表达式中存在不匹配的括号
      • 将操作符逐个弹出并放入输出队列中去
  • 退出算法

后缀表达式(逆波兰)求值

一般是基于堆栈的,算法一般这样描述

操作数入栈,遇到操作符时,操作数出栈,求值,将结果入栈;如此重复。

伪代码

  • while有输入符号
    • 读入下一个符号x
    • IF X是一个操作数
      • 入栈
    • ELSE IF X是一个操作符
      • 有一个先验的表格给出该操作符需要n个参数
      • IF堆栈少于n个操作数
        • (错误)用户没有输入足够的操作数
      • ELSE,n个操作数出栈
      • 计算操作符
      • 将计算所得的值入栈
    • IF 栈内只有一个值
      • 这个值就是整个计算式的结果
    • ELSE 多余一个值
      • (错误)用户输入了多余的操作数

实际实现过程中出现的问题

字符串如何切割成一个字符

  1. for(int i; i <expss.lengh();i++)
  2.     visit(new Character(s.charAt(2)).toString());

判断字符串是否数字

http://javapub.iteye.com/blog/666544

equals的使用

java的引用类型

需要加入正则表达式

  1. public static boolean isInteger(String str) {
  2. Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
  3. return pattern.matcher(str).matches();
  4. }

匹配空格

\s

字符串转化为数字

静态成员初始化

中间会抛出两次

除法注意除数和被除数

还差小数没调整好

时间: 2024-10-12 00:30:30

中缀表达式转化为后缀表达式的相关文章

将中缀表达式转化为后缀表达式

我们把平时所用的标准四则运算表达式,即“9+(3-1)*3+10/2"叫做中缀表达式.因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化. 中缀表达式“9+(3-1)*3+10/2”转化为后缀表达式“9 3 1-3*+ 10 2/+” 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止.

栈的应用之中缀表达式转化为后缀表达式(逆波兰表达式)

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define OK 1 5 #define ERROR 0 6 #define STACK_INIT_SIZE 20 7 #define STACK_INCREMENT 10 8 9 typedef char Elemtype; 10 typedef int Status; 11 12 typedef struct StackNode{ 13 Elemtype* base; 14 Elemt

[Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)

题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信.但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你. 提供两种组合方式: A&B:代表A和B都为真的时候,A和B组合起

中缀表达式转化为后缀表达式——觉得蛮好的题目着实想了半天

题目链接:click here~ 中文题意思非常明了就不解释了..思路就是用栈,要是没有括号此题灰常简单,有括号了就要好好理清思路了 1.是数字就直接进队列或者输出,此题因为是有浮点数,所以不推荐进队列,因为要是一个数字还好,可以用queue<char>来写然后用%C来输出,但是小数怎么办?我觉得也许可以队列输出的时候判断下一个char元素是+ - * / 的时候才输出空格那样就要用2个变量来保存,这样的确可以做,太烦了. 2.是加号减号的时候要不停判断栈顶元素的优先级是否大于等于它,是,输出

中缀表达式转成后缀表达式

参考 数据结构Java实现06----中缀表达式转换为后缀表达式 将中缀表达式转化为后缀表达式 Mycode 1 package collection_Exe; 2 3 import java.util.*; 4 5 public class Exe16 { 6 public static void main(String[] args) { 7 Scanner input = new Scanner(System.in); 8 System.out.println("Input :"

中缀表达式转换成后缀表达式并求值

算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出. 5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 6.最终将栈中的元素依次出栈,输出. 例如 a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出: 后缀表达式:a 堆栈:空 遇到

中缀表达式转换前\后缀表达式的总结

本次个人程序设计要求做一个带有计算功能的程序,而要计算就离不开表达式,按照一般人的习惯,中缀表达式是一个非常常用的方式.但是,对于我们程序员来说,直接计算中缀表达式并不是那么方便,因此,通常来说我们会将中缀表达式进行转换. 不论是转成前缀表达式还是后缀表达式,通过树进行转换都是可以实现的,同时,一棵树就能完成前\中\后缀表达式的互相转换,因此如果仅仅要求转换并且频繁的转换,建立一棵树无疑是方便的.但是,对于计算而言,转换只是其中的一步,因此我们更要考虑效率问题,那么堆栈法就成了我们的首选.堆栈是

中缀表达式转换成后缀表达式

中缀表达式即普通的运算式子,运算符是以中缀形式处于操作数的中间(例:3 + 4),后缀表达式就是逆波兰式(例:3 4 +),中缀表达式转后缀表达式也是学习数据结构中的栈的时候一个典型的例子,结合上一次写到逆波兰式.可以用这种原理即输入普通式子(即中缀表达式),转换成后缀表达式,然后通过后缀表达式(逆波兰式)的计算,可以得出结果. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define STACK_INIT_SIZE 20 4 #de

表达式树—中缀表达式转换成后缀表达式(一)

算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出.5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈6.最终将栈中的元素依次出栈,输出.例如a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出:后缀表达式:a堆栈:空 遇到+:堆栈:空,所以+