..这是我刚学数据结构时编写的。手法可能有点粗糙
import java.util.*;
public class operation {//计算包括括号的四则运算公式 15*15-12-(5+1+2*3)
//简单四则计算器纯字符串
public String count(String a,String b,String c){
String num=null;
double num1;
double num2;
if(c.equals("+")){
num1=Double.parseDouble(a);
num2=Double.parseDouble(b);
num = String.valueOf(num1+num2);
}else if(c.equals("-")){
num1=Double.parseDouble(a);
num2=Double.parseDouble(b);
num = String.valueOf(num1-num2);
}else if(c.equals("*")){
num1=Double.parseDouble(a);
num2=Double.parseDouble(b);
num = String.valueOf(num1*num2);
}else if(c.equals("/")){
num1=Double.parseDouble(a);
num2=Double.parseDouble(b);
num = String.valueOf(num1/num2);
}
return num;
}
// 1:计算 2:压栈 3:删除栈顶元素
public int priority(Stack fu,String a){
//栈为空当然是没办法计算的//一定要先判断是否为空在判断# 为空时没有运算符无法计算
if(fu.isEmpty()){
return 2;
}else if(a.equals("#")){
return 1;
}
String temp=fu.data.get(fu.top);
if(a.equals("+")||a.equals("-")){
if(temp.equals("(")||temp.equals(")")){
return 2;
}else{
return 1;
}
}else if(a.equals("*")||a.equals("/")){
if(temp.equals("*")||temp.equals("/")){
return 1;
}else{
return 2;
}
}else if(a.equals("(")){
return 2;
}else if(a.equals(")")){
if(temp.equals("(")){
return 0;
}else{
return 1;
}
}
System.out.println("发生不可预知错误");
return 0;
}
public void start(){
Scanner input = new Scanner(System.in);
Stack num = new Stack();
Stack fu = new Stack();
//输入时结束位置放#号
String expression = input.next();
expression+="#"; //自动加上#号
//将数字和操作符分离放进数组
ArrayList<String> exp = new ArrayList<String>();
String one="";
for(int i=0;i<expression.length();i++){
char one1=expression.charAt(i);
if(one1=='+'||one1=='-'||one1=='*'||one1=='/'||one1=='('||one1==')'||one1=='#'){
if(!one.equals("")){
exp.add(one);
one="";
}
exp.add(String.valueOf(one1));
}else{
one+=String.valueOf(one1);
}
//当最后是#号时已经不需要做最后的判断
// if(i==expression.length()-1){
// if(!one.equals("")){
// exp.add(one);
// one="";
// }
// }
}
int i=0;
while(i<exp.size()){//表达式遍历结束
String three=exp.get(i);//表达式当时位置的值
if(i<exp.size()){i++;}
if(!(three.equals("+")||three.equals("-")||three.equals("*")||three.equals("/")||three.equals("(")||three.equals(")")||three.equals("#"))){//遇见数值直接压栈
//不是+-*/#只能是数字
num.push(three);
}else{
//当可以计算时持续计算,直到优先级别不够或遇见括号
int temp=priority(fu,three);
//判断是否能计算可以就计算不可以压栈
while(temp==1){
String num1=num.pop();
String num2=num.pop();
String num3=fu.pop();
String two=count(num2,num1,num3);
num.push(two);//计算完毕后将计算结果压进栈
temp=priority(fu,three);//判断下一个符号是否合适计算
}
if(temp==2){//当没有合适的运算符时压栈
fu.push(three);
}else if(temp==0){//只剩下(括号没有必要留下
fu.pop();
}
}
}
System.out.println();
System.out.println(num.pop());//输出结果
}
public static void main(String[] args){
operation test = new operation();
test.start();
}
}
class Stack{//不考虑栈满
ArrayList<String> data = new ArrayList<String>();
int top=-1;
public boolean isEmpty(){
if(top==-1){
return true;
}else{
return false;
}
}
public void push(String x){
++top;
data.add(x);
}
public String pop(){
if(isEmpty()){
System.out.println("栈空");
return null;
}else{
return data.remove(top--);
}
}
}