您的位置:首页 > 编程语言 > Java开发

中缀表达式转换后缀表达式并求值(java实现)

2017-04-15 13:55 615 查看

中缀表达式转换后缀表达式并求值(java实现)

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

为了处理方便,编译程序通常把中缀表达式转化为后缀表达式,后缀表达式也称为“逆波兰式”指代双目运算符在两个运算对象的后面,例如:49*23+。


程序伪代码

1.实例化一个空栈S
2.扫描容器中的字符,执行以下操作
2.1若当前字符是运算对象即数字,则存入后缀表达式容器。
2.2若当前字符是运算符,且其优先级比栈顶运算符高,则使其入栈。
2.3若当前字符是运算符,且其优先级比栈顶运算符相等或低,则将栈顶元素弹出,并将当前字符压入栈中。


中缀表达式转换后缀表达式求值过程

待处理表达式栈内状态(底<->顶)后缀表达式容器
2*(9+6/3-5)nullnull
*(9+6/3-5)null2
(9+6/3-5)*2
9+6/3-5)*(2
+6/3-5)*(29
6/3-5)*(+29
/3-5)*(+296
3-5)*(+/296
-5)*(+/2963
5)*(-2963/+
)*(-2963/+5
*2963/+5-
2963/+5-*

后缀表达式求值

在后缀表达式中,所有的计算按照运算符出现的顺序由左至右进行。


程序伪代码

1.实例化一个空栈S
2.扫描容器中的字符,执行以下操作
2.1若当前字符是运算对象即数字,则入栈。
弹出两个元素进行运算后入栈。
3.输出栈顶元素即结果


后缀表达式求值过程

读字符栈内状态(底<->顶)说明
222入栈
92 9 66入栈
32 9 6 33入栈
/2 9 26,3出栈,执行/运算,将结果2入栈
+2 119,2出栈,执行+运算,将结果11入栈
52 11 55入栈
-2 65,11出栈,执行-运算,将结果6入栈
*122,6出栈执行*操作,将结果12入栈

代码

package com.SimpleSort;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class WorkExpress {
static HashMap<Character, Integer> charTable = new HashMap<Character, Integer>();
//设置运算符的优先级,( 入栈前优先级最高。入栈后最低。
public static void initChatTable(HashMap<Character, Integer> charTable) {
charTable.put('+', 1);
charTable.put('-', 1);
charTable.put('*', 2);
charTable.put('/', 2);
charTable.put('(', 0);
}
//生成后缀表达式
public static ArrayList<Character> listWork(char[] express ) {
List<Character> list = new ArrayList<Character>();
initChatTable(charTable);
Stack<Character> stack = new Stack<Character>();
for(char a : express){
//如果是数字,直接放入容器
if(a>='0'&& a<='9'){
list.add(a);
}else{
//“)”与“(”内的运算符逐个输出
if(a == ')'){
while(stack.peek() != '('){
list.add(stack.pop());
}
//弹出“(” 但是不放入容器。
stack.pop();
}else if(stack.size()==0 || compareChar(a, stack.peek()){                                 stack.push(a);
}else{
/**
* 当前运算符优先级小于等于栈顶运算符,
* 弹出栈顶运算符,并继续判断。
* **/
list.add(stack.pop());
while(!compareChar(a, stack.peek())){
list.add(stack.pop());
}
stack.push(a);
}
}
}
while(stack.size() != 0 ){
list.add(stack.pop());
}
return (ArrayList<Character>) list;
}
//true:当前元素大于栈顶元素;false:当前元素小于等于栈顶元素
public static boolean compareChar(char currect,char stackTop){
if(currect == '('){
return true;
}
else if(charTable.get(currect)>charTable.get(stackTop)){
return true;
}
return false;
}
public static void main(String[] args) {
Scanner sca  = new Scanner(System.in);
char[] express = sca.next().toCharArray();
ArrayList<Character> list = listWork(express);
Stack<Integer> work = new Stack<Integer>();
int result = 0;
System.out.println(list);
for(Character a : list){
System.out.println(result);
if(a>='0' && a <='9'){
work.push(a-48);
}else if(!work.isEmpty()){
//“/”和“-”运算要注意除数和被除数的位置。
Integer per = work.pop();
if(a == '+'){
result =  (per +  work.pop() );
work.push(result);
}
if(a == '-'){
result =  (  work.pop() -per);
work.push(result);
}
if(a == '*'){
result =  (per *  work.pop());
work.push(result);
}
if(a == '/'){
result = (work.pop() / per) ;
work.push(result);
}
}
}
System.out.println(result);
}
}


欢迎学习,如有错误请及时联系本人修改。

希望指出本人不足共同进步

LLY19960418
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: