Dijkstra的双栈算术表达式求值算法

  这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈。

  主体思想就是将每次输入的字符和数字分别存储在两个栈中。每遇到一个单次结束符号(就是“)”),边将运算符号栈中的字符弹出一个,在将数字栈中的数字弹出两个,并进行运算,将最后的结果在压入数字栈中。在进行下次的运算。以此类推。

  整体的算法思路比较清晰,但是算法的实现有一些地方不太如意,这些问题下面在说。下面粘贴代码。

import java.util.Scanner;
import java.util.Stack;

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

        Stack<String> zf = new Stack<String>();// 存储字符串的栈
        Stack<Double> sz = new Stack<Double>();// 存储数字的栈
        while (sc.hasNext()) {
            String s = sc.nextLine();
            if (s.equals("(")) /* 不做操作 */
                ;
            else if (s.equals("+"))
                zf.push(s);
            else if (s.equals("-"))
                zf.push(s);
            else if (s.equals("*"))
                zf.push(s);
            else if (s.equals("/"))
                zf.push(s);
            else if (s.equals("sqrt"))
                zf.push(s);
            else if (s.equals(")")) {
                // 从栈中取出数据,字符串和数字
                // pop移除堆栈顶部的对象,并作为此函数的值返回该对象。
                String zf1 = zf.pop();
                Double sz1 = sz.pop();
                // 将取出的数据计算
                if (zf1.equals("+"))
                    sz1 = sz.pop() + sz1;// 取出字符串,再进行比较。并取出数字进行相应的计算
                else if (zf1.equals("-"))
                    sz1 = sz.pop() - sz1;
                else if (zf1.equals("*"))
                    sz1 = sz.pop() * sz1;
                else if (zf1.equals("/"))
                    sz1 = sz.pop() / sz1;
                else if (zf1.equals("sqrt"))
                    sz1 = Math.sqrt(sz1);
                // 再将数字放回去
                sz.push(sz1);

            }
            // else if(s.equals(" ")) System.out.println(sz.pop());
            else {
                //如果取出的字符既不是运算符,也不是括号。将这个字符作为数字压入栈中
                sz.push(Double.parseDouble(s));
            }

        }
        // 按ctrl+z退出控制台输入
        //此处输入还可以改进
        System.out.println(sz.pop());
    }

}

  要说改进的地方就是数据的输入方式,因为本人java学习不太精通,这里具体数据的实现还要写一个方法,不再这里叙述。只是说这个代码还要改进的地方。总体思路是对的。

posted on 2018-04-02 21:46  丶烟雨丶  阅读(431)  评论(0编辑  收藏  举报

导航