题目:输入四则运算的表达式,求解结果算法
思路:用一个栈来存储数字,用另一个栈来存储符号
package test;
import java.util.Scanner;
import java.util.Stack;
public class StrCount {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
int result = strcount(str);
System.out.println(str + "=" + result);
}
private static int strcount(String str) {
// TODO Auto-generated method stub
Stack<Integer> numStack = new Stack<Integer>();
Stack<Character> sybStack = new Stack<Character>();
// numStack.push(Integer.parseInt(String.valueOf(str.charAt(0))));
// sybStack.push(str.charAt(1));
int firstNum = 0;
int secondNum = 0;
int result = 0;
int i = 0;
String number = "";
for (i = 0; i < str.length(); i++) {
if (!String.valueOf(str.charAt(i)).equals("+")
&& !String.valueOf(str.charAt(i)).equals("-")
&& !String.valueOf(str.charAt(i)).equals("*")
&& !String.valueOf(str.charAt(i)).equals("/")) {
int j = i + 1;
number = String.valueOf(str.charAt(i));
while (j < str.length()
&& !String.valueOf(str.charAt(j)).equals("+")
&& !String.valueOf(str.charAt(j)).equals("-")
&& !String.valueOf(str.charAt(j)).equals("*")
&& !String.valueOf(str.charAt(j)).equals("/")) {
String iNum = String.valueOf(str.charAt(j));
number += iNum;
++j;
}
// number +=String.valueOf(str.charAt(i++));
numStack.push(Integer.parseInt(number));
i = j - 1;
} else if (String.valueOf(str.charAt(i)).equals("+")
|| String.valueOf(str.charAt(i)).equals("-")
|| String.valueOf(str.charAt(i)).equals("*")
|| String.valueOf(str.charAt(i)).equals("/")) {
if (sybStack.isEmpty()) {
sybStack.push(str.charAt(i));
} else {
if ((sybStack.peek().equals('+') || sybStack.peek().equals(
'-'))
&& (String.valueOf(str.charAt(i)).equals("*") || String
.valueOf(str.charAt(i)).equals("/"))) {
firstNum = Integer.parseInt(String.valueOf(numStack
.pop()));
if (String.valueOf(str.charAt(i)).equals("*")) {
secondNum = Integer.parseInt(String.valueOf(str
.charAt(++i)));
result = firstNum * secondNum;
} else if (String.valueOf(str.charAt(i)).equals("/")) {
secondNum = Integer.parseInt(String.valueOf(str
.charAt(++i)));
result = firstNum / secondNum;
}
numStack.push(result);
} else if ((sybStack.peek().equals('+') || sybStack.peek()
.equals('-'))
&& (String.valueOf(str.charAt(i)).equals("+") || String
.valueOf(str.charAt(i)).equals("-"))) {
firstNum = Integer.parseInt(String.valueOf(numStack
.pop()));
if (String.valueOf(str.charAt(i)).equals("+")) {
secondNum = Integer.parseInt(String.valueOf(str
.charAt(++i)));
result = firstNum + secondNum;
} else if (String.valueOf(str.charAt(i)).equals("-")) {
secondNum = Integer.parseInt(String.valueOf(str
.charAt(++i)));
result = firstNum - secondNum;
}
numStack.push(result);
} else if ((sybStack.peek().equals('*') || sybStack.peek()
.equals('/'))
&& (String.valueOf(str.charAt(i)).equals("*") || String
.valueOf(str.charAt(i)).equals("/"))) {
firstNum = Integer.parseInt(String.valueOf(numStack
.pop()));
if (String.valueOf(str.charAt(i)).equals("*")) {
secondNum = Integer.parseInt(String.valueOf(str
.charAt(++i)));
result = firstNum * secondNum;
} else if (String.valueOf(str.charAt(i)).equals("/")) {
secondNum = Integer.parseInt(String.valueOf(str
.charAt(++i)));
result = firstNum / secondNum;
}
numStack.push(result);
} else if ((sybStack.peek().equals('*') || sybStack.peek()
.equals('/'))
&& (String.valueOf(str.charAt(i)).equals("+") || String
.valueOf(str.charAt(i)).equals("-"))) {
firstNum = Integer.parseInt(String.valueOf(numStack
.pop()));
secondNum = Integer.parseInt(String.valueOf(numStack
.pop()));
String syb = String.valueOf(sybStack.pop());
if (syb.equals("*")) {
result = firstNum * secondNum;
} else if (syb.equals("/")) {
result = firstNum / secondNum;
}
numStack.push(result);
}
}
// sybStack.push(str.charAt(i));
}
}
if (i == str.length()) {
firstNum = Integer.parseInt(String.valueOf(numStack.pop()));
secondNum = Integer.parseInt(String.valueOf(numStack.pop()));
String syb = String.valueOf(sybStack.pop());
if (syb.equals("+")) {
result = firstNum + secondNum;
} else if (syb.equals("-")) {
result = firstNum - secondNum;
} else if (syb.equals("*")) {
result = firstNum * secondNum;
} else if (syb.equals("/")) {
result = firstNum / secondNum;
}
}
return result;
}
}