软件体系结构实验二

软件体系结构实验二

1. 实现”四则运算“的简易翻译器

1.1 要求

  • 实现加减乘除四则运算,允许同时有多个操作数,如:4+6*5-8 结果是26;
  • 被操作数为整数,整数可以有多位;
  • 处理空格;
  • 输入错误显示错误提示,并返回命令状态“CALC"。

1.2 思路

由于乘除优于加减运算,因此不妨先进行所有的乘除运算,并且将这些乘除运算后的整数值放回原来表达式的相应位置,则随后整个表达式的值,就等于一系列整数加减后的值。

基于此,我们可以用一个栈,保存这些(进行乘除运算后的)整数的值,对于加减号后的数字,将其直接压入栈中;对于乘除号后的数字,可以直接与栈顶元素进行计算,并且换栈顶元素为计算后的结果。

具体来说,遍历表达式字符串express,并用变量preSign记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。每次遍历到数字末尾时,根据preSign来决定计算方式:

  • 加号:将数字压入栈;
  • 减号:将数字的相反数压入栈;
  • 乘除号:计算数字与栈顶元素,并将栈顶元素替换为计算结果。

代码实现中,若读到一个运算符,或者遍历到字符串末尾,即认为是遍历到了数字末尾。处理完该数字后,更新preSign为当前遍历的字符。

遍历完表达式字符串express后,将栈中元素相加,即为该表达式的值。

import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        final String cmd = "CALC> ";
        Scanner in = new Scanner(System.in);
        while (true){
            System.out.print(cmd);
            String expression = in.nextLine();
            System.out.println(calculate(expression));
        }
    }
    public static int calculate(String expression) {
        //处理空格
        expression.trim();
        Deque<Integer> stack = new LinkedList<Integer>();
        char preSign = '+';
        int num = 0;
        int n = expression.length();
        for (int i = 0; i < n; ++i) {
            if (Character.isDigit(expression.charAt(i))) {
                num = num * 10 + expression.charAt(i) - '0';
            }
            if (!Character.isDigit(expression.charAt(i)) && expression.charAt(i) != ' ' || i == n - 1) {
                switch (preSign) {
                    case '+':
                        stack.push(num);
                        break;
                    case '-':
                        stack.push(-num);
                        break;
                    case '*':
                        stack.push(stack.pop() * num);
                        break;
                    default:
                        stack.push(stack.pop() / num);
                }
                preSign = expression.charAt(i);
                num = 0;
            }
        }
        int ans = 0;
        while (!stack.isEmpty()) {
            ans += stack.pop();
        }
        return ans;
    }
}

2. 搭建Hadoop平台,实现wordcloud算法

  1. 下载Hadoop,下载地址: http://hadoop.apache.org/releases.html

  2. 安装JDK。注:Hadoop依赖JDK且要求路径中不能有空格,所以将JDK安装在没有空格的目录中(一般默认安装在C盘的Program file文件夹中,但是这个目录有空格,所以选择安装在别的目录,这里建议安装在D盘 建立一个Java文件夹,安装在这个文件夹下,当然其他文件下也是没有问题的,就是要保证路径中没有空格, 如果安装在program files文件夹下,请注意看配置5)

  3. 将下载的Hadoop解压缩,下载winutils,将里面的bin替换Hadoop的bin文件

  4. 配置环境变量,增加HADOOP_HOME变量,在path变量中增加%HADOOP_HOME%\bin变量

  5. Hadoop配置,在hadoop-3.2.2/etc/hadoop/文件夹下修改这些文件:

    • ore-site.xml

      <configuration>
      	<property>
             <name>fs.default.name</name>
             <value>hdfs://localhost:9000</value>
         </property>
      </configuration>
      
    • mapred-site.xml

      <configuration>
      	<property>
             <name>mapreduce.framework.name</name>
             <value>yarn</value>
         </property>
      </configuration>
      
    • 在hadoop-3.2.2目录下创建data目录,作为数据存储路径

      在hadoop-3.2.2/data目录下创建datanode目录;

      在hadoop-3.2.2/data目录下创建namenode目录;

    • hdfs-site.xml配置:((配置过程中,将Hadoop设置成自己的路径))

      <configuration>
      <!-- 这个参数设置为1,因为是单机版hadoop -->
          <property>
              <name>dfs.replication</name>
              <value>1</value>
          </property>
      	<property> 
           <name>dfs.permissions</name> 
           <value>false</value> 
        </property>
         <property>
             <name>dfs.namenode.name.dir</name>
             <value>/D:/hadoop-3.2.2/data/namenode</value>
         </property>
      	   <property>
             <name>dfs.datanode.data.dir</name>
             <value>/D:/hadoop-3.2.2/data/datanode</value>
         </property>
      </configuration>
      
    • 在Hadoop-env.cmd中设置Java_Home

软件体系结构实验二
这里如果有有jdk环境也可以不用更改。

  • yarn-site.xml

    <configuration>
       <property>
           <name>yarn.nodemanager.aux-services</name>
           <value>mapreduce_shuffle</value>
       </property>
       <property>
           <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
           <value>org.apache.hadoop.mapred.ShuffleHandler</value>
       </property>
    <property>
            <!-- 中间结果存放位置 -->
            <name>yarn.nodemanager.local-dirs</name>
            <value>/D:/hadoop-3.2.2/tmp</value>
        </property>
    </configuration>
    
    

    将hadoop的bin文件下的hadoop.dll拷贝至c盘windows/system32文件夹下

  1. 配置完成之后,使用管理员权限打开cmd命令行,切换至hadoop的bin文件夹下,启动hdfs namenode -format配置文件格式
    软件体系结构实验二

  2. 进入Hadoop的sbin文件夹start-all.cmd启动Hadoop服务会出现四个窗口

  3. \1. 重新打开一个cmd命令行,进入Hadoop bin,运行hadoop fs -mkdir /user创建新的文件夹,新建一个txt文件,在里面输入一段英文文字,使用命令

    hadoop fs -put “你创建的文件” /user

    上传你的文件,hdfs dfs -cat /user/input_file.txt来查看文件的内容,如下图所示
    软件体系结构实验二

  4. 下载MapReduceClient.jar文件,在刚才命令行里运行>hadoop jar D:/MapReduceClient.jar wordcount /user /output 实现wordcount算法,会看到以下结果:
    软件体系结构实验二

  5. 最后使用命令hdfs dfs -cat /output/*查看词的统计结果,如下图
    软件体系结构实验二

上一篇:如何完成复杂查询的动态构建?


下一篇:.NET RulesEngine(规则引擎)