由于乘除优于加减运算,因此不妨先进行所有的乘除运算,并且将这些乘除运算后的整数值放回原来表达式的相应位置,则随后整个表达式的值,就等于一系列整数加减后的值。
基于此,我们可以用一个栈,保存这些(进行乘除运算后的)整数的值,对于加减号后的数字,将其直接压入栈中;对于乘除号后的数字,可以直接与栈顶元素进行计算,并且换栈顶元素为计算后的结果。
具体来说,遍历表达式字符串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; } }
下载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/*查看词的统计结果,如下图