软件体系结构实验二
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算法
-
下载Hadoop,下载地址: http://hadoop.apache.org/releases.html
-
安装JDK。注:Hadoop依赖JDK且要求路径中不能有空格,所以将JDK安装在没有空格的目录中(一般默认安装在C盘的Program file文件夹中,但是这个目录有空格,所以选择安装在别的目录,这里建议安装在D盘 建立一个Java文件夹,安装在这个文件夹下,当然其他文件下也是没有问题的,就是要保证路径中没有空格, 如果安装在program files文件夹下,请注意看配置5)
-
将下载的Hadoop解压缩,下载winutils,将里面的bin替换Hadoop的bin文件
-
配置环境变量,增加HADOOP_HOME变量,在path变量中增加%HADOOP_HOME%\bin变量
-
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文件夹下
-
配置完成之后,使用管理员权限打开cmd命令行,切换至hadoop的bin文件夹下,启动hdfs namenode -format配置文件格式
-
进入Hadoop的sbin文件夹start-all.cmd启动Hadoop服务会出现四个窗口
-
\1. 重新打开一个cmd命令行,进入Hadoop bin,运行hadoop fs -mkdir /user创建新的文件夹,新建一个txt文件,在里面输入一段英文文字,使用命令
hadoop fs -put “你创建的文件” /user
上传你的文件,hdfs dfs -cat /user/input_file.txt来查看文件的内容,如下图所示
-
下载MapReduceClient.jar文件,在刚才命令行里运行>hadoop jar D:/MapReduceClient.jar wordcount /user /output 实现wordcount算法,会看到以下结果:
-
最后使用命令hdfs dfs -cat /output/*查看词的统计结果,如下图