zoukankan      html  css  js  c++  java
  • 算法-第四版-练习1.3.9解答

    问题

    编写一段程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。例如,给定输入:

    1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )

    你的程序应该输出:

    ( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )

    解决思路

    使用两个栈分别保存数值和操作符,分别为opr和data。顺序处理输入字符串的字符:

    • 如果为操作符,压入opr。
    • 否则,如果为右括号,从data取出两个操作数,从opr取出1个操作符,添加括号组合后压入data。
    • 否则,为数字,压入data。

    以上处理办法需要输出满足以下条件,也就是有如下的假设:

    • 输入表达式是合法的。

    代码

    /**
     * Description : 
     * Author      : mn@furzoom.com
     * Date        : Oct 20, 2016 9:26:55 AM
     * Copyright (c) 2013-2016, http://furzoom.com All Rights Reserved.
     */
    
    package com.furzoom.lab.algs.ch103;
    
    /**
     * ClassName : E10309 <br>
     * Function : TODO ADD FUNCTION. <br>
     * date : Oct 20, 2016 9:26:55 AM <br>
     * 
     * @version
     */
    public class E10309
    {
        public static String getCompleteExpression(String exp)
        {
            String[] params = exp.split(" ");
            Stack<String> oprStack = new Stack<String>();
            Stack<String> dataStack = new Stack<String>();
            for (int i = 0; i < params.length; i++) {
                if (isOperator(params[i])) {
                    oprStack.push(params[i]);
                } else if (params[i].equals(")")) {
                    String d1 = dataStack.pop();
                    String d2 = dataStack.pop();
                    String op = oprStack.pop();
                    dataStack.push("( " + d2 + " " + op + " "+ d1 + " )");
                } else {
                    dataStack.push(params[i]);
                }
            }
            return dataStack.pop();
        }
       
        public static void main(String[] args)
        {
            String expression = "1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )";
            String result = getCompleteExpression(expression);
            System.out.println(result);
        }
        
        private static boolean isOperator(String s)
        {
            return (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/"));
        }
     
    }
    


    结果

    ( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )



    算法-第四版-1.3 背包、队列和栈-习题索引汇总

    算法-第四版习题索引汇总


  • 相关阅读:
    Ping
    boost::python开发环境搭建
    mingw和libcurl
    ssh远程执行命令使用明文密码
    netty源码阅读之UnpooledByteBufAllocator
    Direct ByteBuffer学习
    clions的使用
    netty中的PlatformDependent
    STL之priority_queue(优先队列)
    c++线程调用python
  • 原文地址:https://www.cnblogs.com/furzoom/p/7710194.html
Copyright © 2011-2022 走看看