# 用java实现计算String类型的四则运算——用栈和后缀表达式实现

最近看数据结构，看到栈和后缀表达式的地方，于是自己动手用写了一段很简单的实现计算String类型的四则运算的例子。



class D1 implements Serializable {
public static void main(String[] args) {
//这里做测试
D1 d = new D1();
String str = "9+(3-1)*3-10/2";
List<String> list = d.infixToSuffix(str);
Integer num = d.getReslut(list);
System.out.println(num);
}

/**
* 传入转换完毕的后缀表达式，计算
* @param list
* @return
*/
public Integer getReslut(List<String> list){
Integer n1 = null;
Integer n2 = null;
Integer reslut = null;
Deque<Integer> opt = new LinkedList<Integer>();
for(int i=0;i<list.size();i++){
String num = list.get(i);
try {
Integer n = Integer.valueOf(num);
opt.offerFirst(n);
}catch (Exception e){
n2 = opt.pollFirst();
n1 = opt.pollFirst();
if("+".equals(num)){
reslut = n1 + n2;
}else if("-".equals(num)){
reslut = n1 - n2;
}else if("*".equals(num)){
reslut = n1 * n2;
}else if("/".equals(num)){
reslut = n1 / n2;
}
opt.offerFirst(reslut);
}
}

return  opt.pollFirst();
}

//9+(3-1)*3-10/2 = 10
//  9 3 1 - 3 * 10 2 / - +
/**
* 中缀表达式转后缀表达式，直接传入算数式
* @param str
* @return
*/
public List<String> infixToSuffix(String str) {
List<String> numlist = getNums(str);
List<String> list = new ArrayList<String>();
Deque<String> deque = new LinkedList<String>();
for (int i = 0; i < numlist.size(); i++) {
//            Character c = str.charAt(i);
String num = numlist.get(i);
if("(".equals(num)||"*".equals(num)||"/".equals(num)){
deque.offerFirst(num);
}else if("+".equals(num)||"-".equals(num)){
}else if(")".equals(num)){
rightKuo(deque, num, list);
}else{
}
if (i == numlist.size() - 1) {
while (true) {
String next = deque.pollFirst();
if (null == next) {
break;
}
}
}
}
return list;
}

private void addAndMul(Deque<String> deque, String c, List<String> list) {
while (true) {
String    next = deque.peekFirst();
if (null == next || "+".equals(next) || "-".equals(next) || "(".equals(next)) {
deque.offerFirst(c);
break;
}
}
}
private void rightKuo(Deque<String> deque, String c, List<String> list) {
while (true) {
String next = deque.pollFirst();
if ("(" .equals(next)) {
break;
}
}
}
/**
* 将String类型算数表达式转换为list，将数字与运算符分开
* @param str
* @return
*/
private List<String> getNums(String str) {
String nums = "0123456789";
String opts = "()+-*/";
//        String[] ss = new String[str.length()];
List<String> list = new ArrayList<String>();
int j = 0;
for (int i = 0; i < str.length(); i++) {
if (i == 0) {
//                ss[j] = str.substring(i, i + 1);
list.add(str.substring(i, i + 1));
} else {
String per = str.substring(i - 1, i);
String now = str.substring(i, i + 1);
if(opts.indexOf(now)>-1 ){
j++;
//                    ss[j] = now;
}else if(nums.indexOf(now)>-1){
if(nums.indexOf(per)>-1){
//                        ss[j]=ss[j]+now;
list.set(j,list.get(j)+now);
}else{
j++;
//                        ss[j] = now;
}
}
}
}
return list;
}
}

• 本文已收录于以下专栏：

## Java四则运算表达式求解

• u010893129
• 2014年05月08日 10:14
• 1124

## Java字符串转运算、条件表达式

• wudiyong22
• 2018年01月15日 11:33
• 61

## java运算四则运算表达式的程序

• 2014年07月10日 18:23
• 14KB
• 下载

## 在Java中计算四则运算表达式字符串的值

• zhangbest2009
• 2015年05月13日 17:34
• 2684

## JAVA实现字符串四则运算

JAVA实现输入字符串四则运算表达式（不带括号）输出字符串结果
• H992109898
• 2016年11月03日 21:19
• 1885

## 用java实现计算String类型的四则运算——用栈和后缀表达式实现

• oqqLai123456
• 2015年11月18日 23:15
• 663

## java中用String类型进行计算

java中用String类型进行计算在Java中如果要用String类型进行计算的话需要先转换成int型，再进行计算。用到:String.valueOfInteger.valueOf举例：psr.se...
• myfxx
• 2014年01月14日 16:23
• 1287

## 用栈实现四则运算表达式（c++）

• scuisdccch
• 2015年09月29日 09:55
• 2460

## 【数据结构】用栈实现对后缀表达式的计算

• qq_31828515
• 2016年11月27日 17:12
• 1064

## java实现字符串四则运算公式解析工具类

• zmx729618
• 2016年08月26日 15:01
• 3447

举报原因： 您举报文章：用java实现计算String类型的四则运算——用栈和后缀表达式实现 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)