zoukankan      html  css  js  c++  java
  • 前缀表达式求值 (支持多位数和负数)

    1.运行过程

      1. 输入

        输入一个前缀表达式字符串,每个元素用一个空格隔开

      2.前序遍历方式构造表达式二叉树

      3.后序遍历得到后缀后求值。

    2.代码如下

    import java.util.*;
    public class MakeBinaryTree {
    
        public static int i=0;
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner is=new Scanner(System.in);
            while(is.hasNext()) {
                i=0;
                String target=is.nextLine();
                TreeNode<String> exp=null;
                String[] c=target.split(" ");
                exp=preMake(exp,c);
                StringBuilder sb=new StringBuilder();
                toPostExp(exp,sb);
                System.out.println(calcuPost(sb.toString()));
            }
            is.close();
        }
        
        
        
        private static void toInExp(TreeNode<String> root,StringBuilder sb) {
            if(root!=null) {
                toInExp(root.left,sb);
                sb.append(root);
                toInExp(root.right,sb);
            }
        }
        
        private static void toPostExp(TreeNode<String> root,StringBuilder sb) {
            if(root!=null) {
                toPostExp(root.left,sb);
                toPostExp(root.right,sb);
                sb.append(root+" ");
            }
        }
        
        private static int calcuPost(String post) {
            Stack<Integer> stk=new Stack<>();
            String[] ss=post.split(" ");
            for(String s:ss) {
                if(s.matches("-?\d+")) {
                    int a=Integer.parseInt(s);
                    stk.push(a);
                }else {
                    char c=s.charAt(0);
                    int b=stk.pop();
                    int a=stk.pop();
                    int t;
                    if(c=='+')
                        t=a+b;
                    else if(c=='-')
                        t=a-b;
                    else if(c=='*')
                        t=a*b;
                    else
                        t=a/b;
                    stk.push(t);
                }
            }
            return stk.pop();
        }
        private static TreeNode<String> preMake(TreeNode<String> root,String[] c) {
            if(i==c.length)
                return null;
            if(c[i].matches("-?\d+"))
                return new TreeNode<String>(c[i++]);
            else {
                root=new TreeNode<String>(c[i++]);
                root.left=preMake(root.left,c);
                root.right=preMake(root.right,c);
                return root;
            }
        }
        
    }
    class TreeNode<E>{
        E element;
        TreeNode<E> left;
        TreeNode<E> right;
        public TreeNode(E e) {
            this.element=e;
        }
        public String toString() {
            return element.toString();
        }
    }
  • 相关阅读:
    error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 E:OCX
    JQUERY解析XML IE8的兼容问题
    IE11下,IIS7.5不自动生成__doPostBack事件
    IE11无法支持Forms认证,,,也就是无法保存COOKIE
    IIS7.5真变态,服务器时间格式导致不生成WebResource.axd
    django ajax MTV与MVC 多对多创建方式
    django F与Q查询 事务 only与defer
    模型层
    模板层(模板语法)
    django 路由层 伪静态网页 虚拟环境 视图层
  • 原文地址:https://www.cnblogs.com/lshao/p/8612979.html
Copyright © 2011-2022 走看看