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

  • 相关阅读:
    编写属于自己的Linux Service命令
    Cloudera Manager和CDH4.1的安装
    html5基础教程收集整理精华
    Javascript跳转页面和打开新窗口等方法
    VK值列表
    标准C++之fstream
    PeekMessage用法
    Web系统常用测试方法
    VC控件的一些原理
    Visual C++ 文件操作
  • 原文地址:https://www.cnblogs.com/yanyu01/p/8697934.html
Copyright © 2020-2023  润新知