算术表达式求值系列之后缀表达式转后缀表达式

  1 package data.struct.algorithm;
  2
  3 import java.io.BufferedReader;
  4 import java.io.IOException;
  5 import java.io.InputStreamReader;
  6
  7 //定义栈,用于存放转换过程中的操作符
  8 class StackFix {
  9     // 栈的大小
 10     private int maxSize;
 11     // 数组模拟栈
 12     private char stackArr[];
 13     // 栈顶指针
 14     private int top;
 15
 16     // 构造函数初始化栈
 17     public StackFix(int s) {
 18         maxSize = s;
 19         stackArr = new char[maxSize];
 20         top = -1;
 21     }
 22
 23     // 进栈
 24     public void push(char value) {
 25         stackArr[++top] = value;
 26     }
 27
 28     // 出栈
 29     public char pop() {
 30         return stackArr[top--];
 31     }
 32
 33     // 显示栈顶元素
 34     public char peek() {
 35         return stackArr[top];
 36     }
 37
 38     // 判断栈是否为空
 39     public boolean isEmpty() {
 40         return top == -1;
 41     }
 42 }
 43
 44 // 转换类
 45 class InTranstoPost {
 46     private StackFix theStackFix;
 47     private String input;
 48     private String output = "";
 49
 50     // 初始化
 51     public InTranstoPost(String in) {
 52         input = in;
 53         int stackSize = input.length();
 54         theStackFix = new StackFix(stackSize);
 55     }
 56
 57     // 主要转换功能函数
 58     public String doTran() {
 59         for (int j = 0; j < input.length(); j++) {
 60             // 获取一个输入字符串的一个字符
 61             char ch = input.charAt(j);
 62             switch (ch) {
 63
 64             case ‘+‘:
 65             case ‘-‘:
 66                 // 如果字符为‘+‘或者‘-‘,若栈空,则直接让该字符进栈,否则,弹出栈顶元素进行判断,参数1为运算符的优先级
 67                 gotOper(ch, 1);
 68                 break;
 69             case ‘*‘:
 70             case ‘/‘:
 71                 // 如果字符为‘*‘或者‘/‘,若栈空,则直接让该字符进栈,否则,弹出栈顶元素进行判断,参数2为运算符的优先级
 72                 gotOper(ch, 2);
 73                 break;
 74             case ‘(‘:
 75                 // 如果字符为‘(‘,则压入栈中
 76                 theStackFix.push(ch);
 77                 break;
 78             case ‘)‘:
 79                 // 如果字符为‘)‘,则弹出栈顶元素,如果栈顶元素为‘(‘,则结束循环,输出转换结果,否则依次弹出栈顶元素并输出,
 80                 // 直到碰到‘(‘
 81                 gotRbracket(ch);
 82                 break;
 83             default:
 84                 // 字符为操作数,不入栈,直接输出
 85                 output = output + ch;
 86                 break;
 87             }
 88         }
 89         // 判断输入的字符串的每一个字符的循环结束,依次弹出栈中的元素,并输出
 90         while (!theStackFix.isEmpty()) {
 91             output = output + theStackFix.pop();
 92         }
 93         return output;
 94     }
 95
 96     // 该函数用于字符为‘)‘时的相应操作
 97     public void gotRbracket(char ch) {
 98         while (!theStackFix.isEmpty()) {
 99             char chx = theStackFix.pop();
100             if (chx == ‘(‘) {
101                 break;
102             } else {
103                 output = output + chx;
104             }
105         }
106     }
107
108     // 非‘)‘字符的其他操作符的处理
109     public void gotOper(char opThis, int prec1) {
110         while (!theStackFix.isEmpty()) {
111             char opTop = theStackFix.pop();
112             if (opTop == ‘(‘) {
113                 theStackFix.push(opTop);
114                 break;
115             } else {
116                 int prec2;
117                 if (opTop == ‘+‘ || opTop == ‘-‘) {
118                     prec2 = 1;
119                 } else {
120                     prec2 = 2;
121                 }
122                 if (prec2 < prec1) {
123                     theStackFix.push(opTop);
124                     break;
125                 } else {
126                     output = output + opTop;
127                 }
128             }
129         }
130         // 栈空,字符直接压入栈中
131         theStackFix.push(opThis);
132     }
133 }
134
135 // 主函数
136 public class InfixToPostFix {
137
138     /**
139      * @param args
140      * @throws IOException
141      */
142     public static void main(String[] args) throws IOException {
143
144         // 定义两个字符串,一个接收键盘输入,一个用于代表转换后的字符串
145         String input, output;
146         while (true) {
147             System.out.println("Enter a InFix:");
148             System.out.flush();
149             // getString()函数,从键盘获取输入的中缀表达式字符串
150             input = getString();
151             // 输入的字符串为空,结束判断
152             if (input.equals("")) {
153                 break;
154             }
155             // 进行转换
156             InTranstoPost tran = new InTranstoPost(input);
157             output = tran.doTran();
158             System.out.println("Thr Postfix is " + output);
159         }
160     }
161
162     // 键盘获取输入的方式,常用做法
163     public static String getString() throws IOException {
164         InputStreamReader isr = new InputStreamReader(System.in);
165         BufferedReader bufr = new BufferedReader(isr);
166         String s = bufr.readLine();
167         return s;
168     }
169 }
时间: 2024-11-06 17:52:23

算术表达式求值系列之后缀表达式转后缀表达式的相关文章

表达式求值算法、rpn、1470、1475、1477、1479

以下为表达式求值系列完整算法,借用C++语言,读者不妨对照下图表达式求值算法实例,仔细推敲. 1 /* 2 DATA:2015 1 30 3 From:13420228 4 */ 5 //测试数据: 6 // 4 7 // (0!+1)*2^(3!+4) - (5! - 67 - (8+9)) 8 // (1+2)*3+4*5 9 // 1.000 + 2 / 4 10 // ((1+2)*5+1)/(4^2)*3 11 #include <iostream> 12 #include <

Diagram Designer 的表达式求值工具(Expression Evaluator)

软件版本:Diagram Designer (Version 1.24) 一.Diagram Designer 的表达式求值工具 下图为 Diagram Designer 的表达式求值工具: 在程序的帮助手册中,对这个表达式求值工具的使用有着较为详细的描述.(在[Using Diagram Designer]的[Expression Evaluator]章节,不过内容是英文的) 里面提到了这个表达式求值工具有下面几个特征(Notable Features): trigonometric func

栈的应用——表达式求值

表达式求值是程序设计语言编译中的一个基本问题,它的实现就是对“栈”的典型应用.本文针对表达式求值使用的是最简单直观的算法“算符优先法”. 本文给出两种方式来实现表达式求值,方式一直接利用中缀表达式求值,需要用到两个栈,操作数栈和操作符栈.首先置操作数栈为空栈, 操作符栈仅有“#”一个元素.依次读入表达式中的每个字符,若是操作数则进操作数栈,若是操作符则和操作符栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕.方式二首先把中缀表达式转换为后缀表达式并存储起来,然后利用读出的后缀表达式完成

栈的应用—算术表达式求值

例三.算术表达式求值 1.问题描述 当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2.思路 首先我们要知道表达式分为三类:  ①中缀表达式:a+(b-c/d)*e ②前缀表达式+a*-be ③后缀表达式abcd/-e*+ 由于运算符有优先级,所以在计算机中计算一个中缀的表达式非常困难,特别是带括号的更麻烦,而后缀表达式中既无运算符优先又无括号的约束问题因为在后缀表达式中运算符出现的顺序正是计算的顺序,所以计算一个后缀的表达式更简单.所以,可

java实现算术表达式求值

需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后缀表达式为32+,3*(2+1)的后缀表达式为:321+*,解决表达式求值首先需要根据字符串表达式求出后缀表达式,然后使用后缀表达式和操作数栈实现计算,计算的大致思想是从后缀表达式中取元素,如果元素是数值则加入到操作数栈中,如果是运算符则从操作数栈中取两个数来参与运算.后缀表达式的获取要借助于两个栈

将中缀表达式转换为后缀表达式,然后利用栈对表达式求值。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js.js"></script> </head> <body> 输入中缀表达式空格分隔 例如 2 + 3 <input type=

数据结构 -- 整数算术表达式求值 (C/C++)

数据结构题集(C语言版)--严蔚敏,吴伟民编著 设置运算符栈和运算数栈辅助分析运算符有限关系. 读入表达式的字符序列的同时完成运算符和运算数(整数)的识别处理,以及相应的运算. 在识别出运算数的同时,要将其字符序列形式转换成整数形式. 1 /** 2 Function:整数算术表达式求值 3 Date:2014-11-10 4 Author:JackDawson 5 Compiler:gcc version 4.8.1 6 */ 7 #include <iostream> 8 #include

page80-栈用例-算术表达式求值

表达式由括号, 运算符和操作数(数字)组成.我们根据以下4中情况从左到右逐个将这些实体送入栈处理. (1)将操作数压入操作数栈: (2)将运算符压入运算符栈: (3)忽略左括号: (4)在遇到右括号时, 弹出一个运算符,弹出所需数量的操作符,并将运算符和操作符的运算结果压入操作数栈. [地杰斯特拉的双栈算术表达式求值算法] public class Evaluate { public static void main(String[] args) { Stack<String> ops = n

表达式求值(后缀表达式求值)

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束.这个表达式里只包