说明:程序只是为了说明计算规则(思路),并未优化,可能还是存在一些BUG(未进行大量数据的反复验证),必有更好的实现方式!!!
另外,在计算过程中,由于采用int,因此对于如5/3*3并不是5,而是3,所以可能计算结果有点出入!!!
栈:先进后出
四则运算的运用:
①将中缀表达式转为后缀表达式
规则1:若出现的符号等级低于栈顶的表达式等级(如符号为'+或-',而栈顶为'*或/',则除顶部自己外其余全部出栈;若碰到同级则只出栈一个(如符号为'+',而栈顶为'-'且栈中还有'+-',则只出栈顶一个'-')
规则2:若出现左右括号,则括号内的内容全部出栈
规则3:非符号(即数字)不用进栈,只需依次记录即可
②入栈计算后缀表达式并得出结果
规则:类似"56*"则计算为5*6=30,然后30入栈继续计算
附上代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class Test {
public static void main(String[] args) {
//Test1
String str1[] = {"9","+","(","3","-","1",")","*","3","+","10","/","2"};
System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str1)));
//Test2
String str2[] = {"3","+","6"};
System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str2)));
//Test3
String str3[] = {"13","-","6","/","2","-","1","+","3","*","5","/","3"};
System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str3)));
//Test4
String str4[] = {"4","/","2","+","1","-","5","+","3","*","6","/","2"};
System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str4)));
}
//将中缀表达式转为后缀表达式
public static List<String> infixExpression2PostfixExpression(String str[]){
List<String> sb = new ArrayList<String>();
Stack<String> s = new Stack<String>();
for(int i=0;i<str.length;i++){
if(str[i].equals("+")||
str[i].equals("-")||
str[i].equals("*")||
str[i].equals("/")||
str[i].equals("(")||
str[i].equals(")")
){
if(s.contains("(")&&str[i].equals(")")){
s.push(str[i]);
Stack<String> ss = new Stack<String>();
ss.addAll(s);
int count = ss.size();
int removeCount = 0;
for(int m=0;m<count;m++){
String pop = ss.pop();
if((!(pop.equals("(")))&&
(!(pop.equals(")")))){
sb.add(pop);
removeCount++;
}else if(pop.equals("(")){
break;
}
}
//+2表示算上左右括号
for(int n=1;n<=(removeCount+2);n++){
s.pop();
}
}else if((str[i].equals("+")&&((s.isEmpty()?"":s.lastElement()).equals("*")||(s.isEmpty()?"":s.lastElement()).equals("/")))||
(str[i].equals("-")&&((s.isEmpty()?"":s.lastElement()).equals("*")||(s.isEmpty()?"":s.lastElement()).equals("/")))||
(str[i].equals("*")&&((s.isEmpty()?"":s.lastElement()).equals("/")))||
(str[i].equals("/")&&((s.isEmpty()?"":s.lastElement()).equals("*")))||
(str[i].equals("+")&&((s.isEmpty()?"":s.lastElement()).equals("-")))||
(str[i].equals("-")&&((s.isEmpty()?"":s.lastElement()).equals("+")))){
if((str[i].equals("+")&&(s.lastElement().equals("*")||s.lastElement().equals("/")))||
(str[i].equals("-")&&(s.lastElement().equals("*")||s.lastElement().equals("/"))) ){
s.push(str[i]);
String sss = "";
int length = s.size();
for(int k=0;k<length;k++){
if(k==0){
sss = s.pop();
}else{
sb.add(s.pop());
}
}
s.push(sss);
}else{
sb.add(s.pop());
s.push(str[i]);
}
}else{
s.push(str[i]);
}
}else{
sb.add(str[i]);
}
}
//最后还有剩余则出栈
int restLength = s.size();
for(int o=0;o<restLength;o++){
sb.add(s.pop());
}
return sb;
}
//将后缀表达式入栈计算并得出最终结果
public static String calculateInfixExpression(List<String> list){
System.out.println(list);
Stack<String> s = new Stack<String>();
for(int i=0;i<list.size();i++){
String data = list.get(i);
if(data.equals("+")||data.equals("-")||data.equals("*")||data.equals("/")){
int firstPop = Integer.parseInt(s.pop());
int secondtPop = Integer.parseInt(s.pop());
int result = 0;
switch(data){
case "+":
result = secondtPop+firstPop;
break;
case "-":
result = secondtPop-firstPop;
break;
case "*":
result = secondtPop*firstPop;
break;
case "/":
result = secondtPop/firstPop;
break;
}
s.push(String.valueOf(result));
}else{
s.push(data);
}
}
//最后应该总是还剩一个
return s.pop();
}
}
分享到:
相关推荐
c语言数据结构栈的四则运算(带括号)的实现,里面有解释
博客配套文件,利用c++ STL容器栈和队列实现四则运算,支持优先级和括号运算。
实数 四则运算 栈 C语言实数 四则运算 栈 C语言实数 四则运算 栈 C语言实数 四则运算 栈 C语言实数 四则运算 栈 C语言实数 四则运算 栈 C语言实数 四则运算 栈 C语言实数 四则运算 栈 C语言实数 四则运算 栈 C语言
利用栈实现四则运算, 有侵权之嫌。但事实上, 它有了改进。 因为可以支持多位的整数的运算,例如55+444*(233-231)。 不太好的地方就是用了两个栈, 但实现还是一样的哦!! 呵呵,
内容为整数和小数的四则运算,用C语言实现的,使用了栈结构。可以实现+-*/和()运算,现在分享给大家!
基于模板类,栈的简单四则运算C++实现,基于模板类,栈的简单四则运算C++实现,基于模板类,栈的简单四则运算C++实现,基于模板类,栈的简单四则运算C++实现,
关于栈的四则运算测试代码,来自040老师
是一款j#版的计算器,稍改动以下能用在java上应用,拥有计算器的基本功能,四则运算是用栈实现的,每一步运行显示都和买的计算器一样——————申明菜鸟版!!
可以实现小数的四则运算,对我之前上传的那个四则运算的改进,现在与大家分享
数据结构课程设计,基于栈的四则运算能力测试系统,模块化设计。
C++栈来运行四则运算 代码存在了word中
利用栈原理,设计模板链式栈,实现四则运算的简易计算器,包括判断表达式是否匹配,中缀表达式转后缀表达式,后缀表达式的计算
用栈实现表达式的四则运算,并使用调试和断言技术对算法进行检测
java简易计算器,能够进行四则运算、三角函数运算,已实现优先级。 将中缀表达式转化成后缀表达式(逆波兰表达式) 主要运用了栈、简单的数学知识,java图形界面设计等相关知识
四则运算实现(c 语言 数据结构课程设计题
当一输入一个四则运算时回车就会计算出这个四则表达式的结果。
用栈实现的四则运算。支持括号,以及多位数字。使用了中序转后序然后计算的思路。
计算器类: 设计一个计算器类模板,适用各类型表达式的“+、-、×、/” 数学四则运算以及“>、>=、<、、!=、==”等关系运算。数学四则运算表达式中可含有加、减、乘、除运算符以及各型数据的运算对象。程序可以直接...
四则运算表达式处理的栈实现,有详细注释,支持表达式预处理与合法性检查,供C++数据结构课程学习与交流使用。
实现了简单四则运算器,利用C#制作计算器页面