从键盘输入一个等式,例如1+1-1,输出最后的答案1,输入的等式不确定项数
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
String s = "12+3-5-1";
char op = '\0';
int num1 = 0, num2 = 0;
s+="+";
for (int i = 0; i < s.length(); i++)
{
if (s.charAt(i) >= '0' && s.charAt(i) <= '9')
{
if (op == '\0')
{
num1 = num1 * 10 + (int)(s.charAt(i) - '0');
}
else
{
num2 = num2 * 10 + (int)(s.charAt(i) - '0');
}
}
if (s.charAt(i) == '+' || s.charAt(i) == '-')
{
if (op == '\0')
{
op = s.charAt(i);
}
else
{
if (op == '+')
num1 = num1 + num2;
else
num1 = num1 - num2;
num2 = 0;
op = s.charAt(i);
}
}
}
System.out.println(num1);
}
}
package test;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class Test3 {
public ArrayList<String> getStringList(String str) {
ArrayList<String> result = new ArrayList<String>();
String num = "";
for (int i = 0; i < str.length(); i++) {
if (Character.isDigit(str.charAt(i))) {
num = num + str.charAt(i);
} else {
if (num != "") {
result.add(num);
}
result.add(str.charAt(i) + "");
num = "";
}
}
if (num != "") {
result.add(num);
}
return result;
}
/**
* 将中缀表达式转化为后缀表达式
*
* @param inOrderList
* @return
*/
public ArrayList<String> getPostOrder(ArrayList<String> inOrderList) {
ArrayList<String> result = new ArrayList<String>();
Stack<String> stack = new Stack<String>();
for (int i = 0; i < inOrderList.size(); i++) {
if (Character.isDigit(inOrderList.get(i).charAt(0))) {
result.add(inOrderList.get(i));
} else {
switch (inOrderList.get(i).charAt(0)) {
case '(':
stack.push(inOrderList.get(i));
break;
case ')':
while (!stack.peek().equals("(")) {
result.add(stack.pop());
}
stack.pop();
break;
default:
while (!stack.isEmpty()
&& compare(stack.peek(), inOrderList.get(i))) {
result.add(stack.pop());
}
stack.push(inOrderList.get(i));
break;
}
}
}
while (!stack.isEmpty()) {
result.add(stack.pop());
}
return result;
}
/**
* 计算后缀表达式
*
* @param postOrder
* @return
*/
public Integer calculate(ArrayList<String> postOrder) {
Stack stack = new Stack();
for (int i = 0; i < postOrder.size(); i++) {
if (Character.isDigit(postOrder.get(i).charAt(0))) {
stack.push(Integer.parseInt(postOrder.get(i)));
} else {
Integer back = (Integer) stack.pop();
Integer front = (Integer) stack.pop();
Integer res = 0;
switch (postOrder.get(i).charAt(0)) {
case '+':
res = front + back;
break;
case '-':
res = front - back;
break;
case '*':
res = front * back;
break;
case '/':
res = front / back;
break;
}
stack.push(res);
}
}
return (Integer) stack.pop();
}
/**
* 比较运算符等级
*
* @param peek
* @param cur
* @return
*/
public static boolean compare(String peek, String cur) {
if ("*".equals(peek)
&& ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-"
.equals(cur))) {
return true;
} else if ("/".equals(peek)
&& ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-"
.equals(cur))) {
return true;
} else if ("+".equals(peek) && ("+".equals(cur) || "-".equals(cur))) {
return true;
} else if ("-".equals(peek) && ("+".equals(cur) || "-".equals(cur))) {
return true;
}
return false;
}
public static void main(String[] args) {
Test3 calculate = new Test3();
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
ArrayList result = calculate.getStringList(s); // String转换为List
result = calculate.getPostOrder(result); // 中缀变后缀
int i = calculate.calculate(result); // 计算
System.out.println(i);
}
}