这次来复习一下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学习不太精通,这里具体数据的实现还要写一个方法,不再这里叙述。只是说这个代码还要改进的地方。总体思路是对的。