栈运算器 Java实现

  • 顺序是true and false, 运算符在中间

  • 状态转移图要想清楚

  • 遇到运算符, 如果栈顶是数值就直接压进去, 不要再去读下一个来计算, 因为我们的运算符在中间

  • 遇到数值, 这时再从栈中pop, 这时左中右是完整的, 可以进行计算

    • 栈顶是or(优先级低), 直接压栈, 以后处理
    • 栈顶是and(优先级高), pop两个, 计算完之后把新值压栈
  • 最后and都处理完了, 栈里只剩or和数值了, 再一个个pop就行

import java.util.*;
public class Main {
	//判断是不是运算符
    static public boolean isOperator(String s){
        if(s.equals("and")||s.equals("or")){
            return true;
        }
        return false;
    }


    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        LinkedList<String> data = new LinkedList<>();
        boolean isAnd = false;

        while(scan.hasNext()){
            String in = scan.next();

            //运算符在最左边或者最右边, 就错误
            if(Main.isOperator(in)&&(data.isEmpty()||(!scan.hasNext()))){
                System.out.println("error");
                return;
            }


            // 检测到运算符
            if(Main.isOperator(in)){

                //由于已经知道data不为空
                String out = data.peek();

                //连续两个运算符
                if(Main.isOperator(out)){
                    System.out.println("error");
                    return;

                }else{
                    // 如果不是, 就直接把操作符压进去
                    data.push(in);
                }

            }else{  //检测到数值
                if(data.isEmpty()) data.push(in);  //如果data是空的话, 直接压进去
                else{   //不空的话, 看看栈顶
                    String out = data.peek();
                    if(!Main.isOperator(out)){  //如果栈顶还是数值,报错
                        System.out.println("error");
                        return;
                    }else if(out.equals("or")){  //如果栈顶是or, 直接压进去
                        data.push(in);
                    }else{     //栈顶是and, 运算完再压
                        data.pop();
                        boolean tmp1 = Boolean.parseBoolean(in);
                        boolean tmp2 = Boolean.parseBoolean(data.pop());
                        data.push(String.valueOf(tmp1&&tmp2));
                    }
                }
            }
        }


        //现在处理data

        boolean res = Boolean.parseBoolean(data.pop());

        while(!data.isEmpty()){
            data.pop();
            boolean new_b = Boolean.parseBoolean(data.pop());
            res = res||new_b;
        }


        System.out.println(res);


    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章