实现中缀表达式转换为后缀表达式主要包含三个类,一个主函数,一个自定义栈的类,还有一个就是核心类,实现其转换。
一、自定义栈的类
package date0617;
/**
*@author TonyJ
*@time 2011-6-17 下午02:24:47
*/
public class MyStack {
private int maxSize;//栈的最大容量
private char[] ch; //栈的数据
private int top; //栈头标记
public MyStack(int s) {
maxSize = s;
ch = new char[s];
top = -1;
}
public void push(char c) {//入栈
ch[++top] = c;
}
public char pop() {//出栈
return ch[top--];
}
public char peek() {
return ch[top];
}
public boolean isEmpty() {
return top == -1;
}
public boolean isFull() {
return top == (maxSize - 1);
}
public int size() {
return top + 1;
}
public char get(int index) {
return ch[index];
}
public void display(String str) {
System.out.print(str);
System.out.print(" Stack (bottom-->top): ");
for (int i = 0; i < size(); i++) {
System.out.print(get(i)+" ");
}
System.out.println();
}
}
二、核心实现类
package date0617;
/**
*@author TonyJ
*@time 2011-6-17 下午02:43:48
*/
public class InToPost {
private MyStack ms;//自定义栈
private String input;//输入中缀表达式
private String output="";//输出的后缀表达式
public InToPost(String input) {
this.input = input;
int size = input.length();
ms = new MyStack(size);
}
public String doTrans() {//转换为后缀表达式方法
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
ms.display("for " + ch + " ");
switch (ch) {
case '+':
case '-':
getOper(ch, 1);
break;
case '*':
case '/':
getOper(ch, 2);
break;
case '(':
ms.push(ch);
break;
case ')':
getParent(ch);
break;
default:
output = output + ch;
break;
}//end switch
}//end for
while(!ms.isEmpty()){
ms.display("While ");
output=output+ms.pop();
}
ms.display("end while!!");
return output;
}
/**
* @param ch
* 获得上一级字符串
*/
public void getParent(char ch) {
while(!ms.isEmpty()){
char chx=ms.pop();
if(chx=='('){
break;
}else{
output=output+chx;
}
}
}
/**
* @param ch 操作符
* @param prec1 操作符的优先级
* 根据操作符的优先级判断是否入栈,及入栈的顺序
*/
public void getOper(char ch, int prec1) {
while (!ms.isEmpty()) {//判断栈是否为空
char operTop = ms.pop();
if (operTop == '(') {
ms.push(operTop);
break;
} else {
int prec2;
if (operTop == '+' || operTop == '-') {
prec2 = 1;
} else {
prec2 = 2;
}
if (prec2 <prec1) {
ms.push(operTop);
break;
} else {
output = output + operTop;
}
}
}// end while
ms.push(ch);
}
}
三、主类代码
package date0617;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
*@author TonyJ
*@time 2011-6-17 下午03:44:49
*/
public class InfixMain {
public static void main(String[] args) {
String input, output;
while (true) {
input = getString();
if ("".equals(input) || input == null) {
break;
}
InToPost itp = new InToPost(input);
output = itp.doTrans();
System.out.println("Profix is " + output + "\n");
}
}
public static String getString() {
String output = "";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("请输入算术表达式:");
output = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return output;
}
}
输入的表达式为:A*(B+C)-D/(E+F)
执行的结果如下:
请输入算术表达式:
A*(B+C)-D/(E+F)
for A Stack (bottom-->top):
for * Stack (bottom-->top):
for ( Stack (bottom-->top): *
for B Stack (bottom-->top): * (
for + Stack (bottom-->top): * (
for C Stack (bottom-->top): * ( +
for ) Stack (bottom-->top): * ( +
for - Stack (bottom-->top): *
for D Stack (bottom-->top): -
for / Stack (bottom-->top): -
for ( Stack (bottom-->top): - /
for E Stack (bottom-->top): - / (
for + Stack (bottom-->top): - / (
for F Stack (bottom-->top): - / ( +
for ) Stack (bottom-->top): - / ( +
While Stack (bottom-->top): - /
While Stack (bottom-->top): -
end while!! Stack (bottom-->top):
Profix is ABC+*DEF+/-
分享到:
相关推荐
2. **后缀表达式**(也称为逆波兰表示法):在这种表示法中,操作符紧跟在其操作数之后,例如,上述中缀表达式转换成后缀表达式为 `2 3 4 * +`。这种表示法简化了计算过程,因为不需要括号来明确优先级,而是通过...
### Java 实现中缀表达式转换为后缀表达式及计算 #### 概述 在计算机科学中,表达式的表示形式通常有三种:前缀、中缀和后缀。其中,中缀表达式是我们日常书写数学表达式时最常见的形式,如`2 + 3 * 4`。然而,在...
解决这个问题的一种方法是将中缀表达式转换为后缀表达式,也称为逆波兰式。后缀表达式是一种易于计算的表达式形式,它的运算符优先级和结合性规则更加简单。 在Java中,实现中缀表达式求值的步骤可以分为以下几步:...
3. **中缀表达式转换为后缀表达式**: 中缀表达式是我们通常看到的数学表达式形式,如"2 + 3 * 4"。转换过程需要用到两个栈:一个运算符栈和一个临时结果栈。遍历表达式,遇到数字直接输出,遇到运算符时,若其...
### 将中缀表达式转换为后缀表达式——深入解析与实现 #### 知识点一:中缀表达式与后缀表达式概念 在计算机科学中,算术表达式有三种主要的表示形式:中缀表达式、前缀表达式和后缀表达式。其中,中缀表达式是...
本文将详细讨论如何将中缀表达式转换为后缀表达式(也称为逆波兰表示法),并结合“表达式树”这一概念进行阐述。在这个过程中,我们将使用VC6.0作为开发环境,但它同样适用于其他编程语言和环境。 首先,我们了解...
本教程将详细介绍如何利用Java编程语言,通过堆栈数据结构将中缀表达式转换为后缀表达式。 1. **堆栈数据结构**: 堆栈是一种先进后出(Last In First Out,简称LIFO)的数据结构。在处理中缀到后缀转换时,堆栈...
本项目的目标是实现一个C++程序,它能够接收用户输入的中缀表达式,将其转换为后缀表达式,并计算出结果。这个过程涉及到以下几个关键知识点: 1. **优先级与结合性**:运算符有不同的优先级和结合性,例如乘法和除...
这个话题主要涉及将中缀表达式转换为后缀表达式,并对后缀表达式进行求值。下面,我们将详细探讨这两个过程。 首先,中缀表达式转后缀表达式的算法通常使用栈数据结构实现。步骤如下: 1. 初始化一个空栈。 2. 从...
在CodeBlocks这样的集成开发环境中,我们可以创建C++、Java或Python等编程语言的工程,编写程序实现上述算法,将用户输入的中缀表达式转换为后缀表达式。例如,RPN文件可能包含的就是一个实现这种转换的源代码。 ...
将一个表达式转为后缀表达式,用堆栈计算 中缀转后缀的过程中遇到数字直接输出,遇到符号则判断优先级。
本主题主要探讨如何将中缀表达式转换为后缀表达式,并将这一过程用C#语言实现。 中缀表达式是我们常见的数学表达式形式,例如 "2 + 3 * 4",其中运算符位于操作数之间。然而,这种表示方式在计算机处理时容易引发...
首先,我们需要理解转换的核心思想:中缀表达式转换为后缀表达式主要依赖于运算符的优先级和结合性。在这个过程中,我们通常会使用一个栈来辅助处理。 1. **运算符优先级**:每个运算符都有一个优先级,例如乘法和...
在给定的"Java中缀表达式变后缀表达式源码"程序中,我们可以推测其核心逻辑是基于栈操作实现的。在Eclipse 3.7环境下测试通过,说明代码是兼容这个版本的IDE的,意味着它应该是遵循Java语言规范并能成功编译和运行的...
这个压缩包文件"SuffixToValue-master"可能包含了关于如何将中缀表达式转换为后缀表达式,并使用后缀表达式进行求值的源代码或教程。 在中缀表达式中,我们通常使用括号和运算符的优先级来确定计算顺序,例如 `2 + ...
后缀表达式是将运算符放在操作数之后的形式,例如,上述中缀表达式对应的后缀表达式为 \(2 3 4 * +\)。这样的表示方式使得求值过程无需使用栈或括号就能进行,大大简化了计算。 本话题主要关注如何使用JavaScript库...
Python实现的编译原理中间代码生成程序,使用了PyQt5写图形界面 题目:设计一个程序,该程序能够将形如x=y op z的简单赋值语句翻译为对应的四元式序列,其中op可为+、-、*、/等二元运算符。要求用图形界面方式编程. ...
中缀转后缀的主要目标是将一个中缀表达式转换成等价的后缀表达式,以便进行计算。这个过程涉及到栈(Stack)数据结构的应用。栈是一种具有“后进先出”(LIFO)特性的数据结构,非常适合处理括号和运算符的优先级...
一个编译原理中缀转后缀表达式(递归下降翻译成AST,后序遍历得到后缀)的 Java 程序,读取文件中的中缀表达式(每个表达式以分号结束,文件中可以有多个表达式)并转换为等价的后缀表达式后输出到屏幕上, 表达式中...