在些声明此两题是论坛上一人的上机试题,解答是本人写的!
原题如下:
第一个:写一个方法,参数传递一个字符串表达式,返回结果为表达式计算结果。如:传递表达式"1+2*3+6-2/2"返回计算的结果。
第二个:9个数1-9组成三个数,如:327 654 981,每个数字只能用一次,每三个数字组成一个新的数字,第二个数是第一个数的两倍,第三个数是第一个数的三倍,用程序实现。
关于第一题我的解答如下:
package com.jishi.shenzheng;
import java.util.Stack;
//解决的第一个BUG为当遇到的运算符出栈时,要直到栈空或栈顶元素的优先组小于当前字符时才能执行入栈操作
//解决的第二个BUG为开妈没有考虑在字符串中处理多位数
public class First {
// 对表达式进行求值运算
public static double evaluation(String expression) {
expression = pretreatment(expression);
// 引入一个字符栈,用来存放在表达式中出现过的运算符
Stack<Character> Chstack = new Stack<Character>();
// 引入一个数字栈,用来存放在表达式中出现过的运算数
Stack<Double> Dostack = new Stack<Double>();
// 扫描表达式
for (int i = 0; i <= expression.length() - 1; i++) {
Character ch = expression.charAt(i);
// 处理表达式中出现的数字
if (Character.isDigit(ch)) { //其中扫描到数字时并不是这么容易处理,要考虑多们数的情况
StringBuilder sb=new StringBuilder();
sb.append(ch);
//这个while循环用来处理字符串中的实数或多位数
while((i+1<=expression.length()-1)&&(Character.isDigit(expression.charAt(i+1))||expression.charAt(i+1)=='.')){
sb.append(expression.charAt(i+1));
i++;
}
Dostack.push(Double.parseDouble(sb.toString()));
} else { // 处理表达式中出现的运算符
if (ch == '(') {
Chstack.push(ch);
} else if (ch == ')') { // 遇到右括号的情况较为复杂,稍后考虑
do{
char operator=Chstack.pop();
if(operator=='(') break;
double d1=Dostack.pop();
double d2=Dostack.pop();
double answer=operation(d1,d2,operator);
Dostack.push(answer);
ch=operator;
}while(ch!='('); //直到栈中弹出左括号为止
} else { // 遇到的是普通的运算符
if (Chstack.isEmpty()) { // 栈空的话直接入栈
Chstack.push(ch);
} else { // 栈非空则根据优先级入栈
int uppriority=priority(ch);
int downpriority=priority(Chstack.peek());
if(downpriority==0){ //如果此时栈顶为左括号则直接入栈
Chstack.push(ch);
}else{
int priority=uppriority-downpriority;
if(priority<=0){ //如果新入本的运算符优先级比栈顶运算符低,此处处理稍微麻烦一点点
do{ //新加入的do_while循环是为了解决第一次遇到的Bug的
char operator=Chstack.pop();
//Chstack.push(ch); //此时的栈顶元的优先仍需判断,此时入栈为时尚早
double d1=Dostack.pop();
double d2=Dostack.pop();
double answer=operation(d1,d2,operator);
Dostack.push(answer);
if(Chstack.empty()) break;
downpriority=priority(Chstack.peek());
if(downpriority==0) break;
priority=uppriority-downpriority;
}while(priority<=0);
Chstack.push(ch);
}else{//如果新入本的运算符优先级比栈顶运算符高则直接入栈即可
Chstack.push(ch);
}
}
}
}
}
}
//返回栈顶元素,即为表达式结果
while(!Chstack.empty()){
char operator=Chstack.pop();
double d1=Dostack.pop();
double d2=Dostack.pop();
double answer=operation(d1,d2,operator);
Dostack.push(answer);
}
return Dostack.pop();
}
// 对表达式进行预处理,主要是为了解决负数运算问题
public static String pretreatment(String expression) {
// 如果负号出现在表达式首部,则易处理在前面加0即可
if (expression.charAt(0) == '-') {
expression = "0" + expression;
}
// 处理负数出现在非首部的情况
expression = expression.replace("(-", "(0-");
return expression;
}
//判断运算符的优先级
public static int priority(char ch) {
switch (ch) {
case '+': return 1;
case '-': return 1;
case '*': return 2;
case '/': return 2;
default: return 0;
}
}
//处理简单的运算
public static double operation(double d1,double d2,char ch){
switch(ch){
case '+':return d1+d2;
case '-':return d2-d1;
case '*':return d1*d2;
case '/':return d2/d1;
default:return 0;
}
}
public static void main(String[] args) {
//测试表达式求值
System.out.println("2.5+3="+First.evaluation("2.5+3"));
System.out.println("(2.5+2)*(2-4)="+evaluation("(2.5+2)*(2-4)"));
System.out.println("-3+(-4)+(5*2+(-3+4)+6)/4+8="+evaluation("-3+(-4)+(5*2+(-3+4)+6)/4+8"));
System.out.println("3+5-6*3+4/2="+evaluation("3+5-6*3+4/2"));
}
}
运行结果如下:
2.5+3=5.5
(2.5+2)*(2-4)=-9.0
-3+(-4)+(5*2+(-3+4)+6)/4+8=5.25
3+5-6*3+4/2=-8.0
关于第二题我的解答如下:
package com.jishi.shenzheng;
//经典回溯思想
public class Second {
public static void dfs(int[] a,int n){
if(n>a.length-1){
int s1=a[0]*100+a[1]*10+a[2];
int s2=a[3]*100+a[4]*10+a[5];
if(s2!=s1*2) return;
int s3=a[6]*100+a[7]*10+a[8];
if(s3==3*s1){
System.out.println(s1+";"+s2+";"+s3);
}
}else{
for(int i=1,j;i<=9;i++){
for(j=0;j<n;j++){
if(i==a[j]){
break;
}
}
if(j<n){
continue;
}else{
a[n]=i;
dfs(a,n+1);
}
}
}
}
public static void main(String[] args){
int[] a=new int[9];
dfs(a,0);
}
}
运行结果如下:
192;384;576
219;438;657
273;546;819
327;654;981
分享到:
相关推荐
编译原理基础习题与上机题解答 西电出版社 刘坚 编译原理基础习题与上机题解答 西电出版社 刘坚
本书是《编译原理基础》(2002年2月出版,刘坚编著)的教学辅导书,内容包括两部分:习题解答,上机题与参考解决方案,并在附录中给出了源程序清单。 本书可以作为工科院校计算机专业或非计算机专业编译原理程课的...
在第一题中,我们需要创建一个控制台应用,利用特定公式计算`q`的近似值。这涉及到基本的输入输出操作,如`Console.WriteLine()`和`Console.ReadLine()`,以及数学运算。 2. **字符串处理与文件操作**:第二题涉及...
本资源包包含了“数据结构”课程的电子课件、习题答案以及上机题答案,对于学习者来说是一份宝贵的资料。 一、课件部分 数据结构的电子课件通常涵盖了以下几个主要章节: 1. 引言:介绍数据结构的基本概念,包括...
本压缩包文件“北航计算机学院复试上机往年试题及解答.zip”包含了历年来的复试上机考试题目以及相关的解答,这对于考生备考具有极高的参考价值。 首先,我们要明确“考研复试”的含义。考研复试是研究生入学考试的...
ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试上机题ADO.NET考试...
本软件包括了二级ACCESS上机真题题库,二级ACCESS历年真题,涵盖了所有的模拟题
希望这份资源能帮助每一个有志于厦门大学计算机类专业的学子,站在前人的肩膀上,更轻松地迈向成功之路。 总的来说,这份厦门大学保研考研上机真题及详解资源是一份宝贵的备考资料,它为考生提供了宝贵的实践机会和...
考研复试上机题库,C语言实现,可以提升上机熟练度,对于计算机专业同学来说是必不可少的
在这些C#上机试题中,我们可以学习到多个核心知识点,包括条件判断、循环、异常处理、类与对象、属性、事件、数组操作、方法重载以及颜色操作等。下面我们将逐一深入探讨: 1. 条件判断与循环:题(1)要求找出1到...
在这个题目中,考生需要编写一个函数来比较两个数组,从数组最后一个元素开始逐个元素向前比较,如果两个数组的长度不等,则只比较较短长度数组的元素。函数返回比较中发现的不相等元素的个数。 代码实现如下: ```...
在操作系统的学习中,上机题是检验理论知识理解和应用能力的重要环节。北京大学的操作系统上机题目通常会涵盖操作系统的核心概念,如进程管理、内存管理和调度算法等。 在上机题中,进程调度是常见的主题。进程调度...
### JavaScript上机实验题知识点概览 #### 一、JavaScript表达式和逻辑控制语句的使用 ##### 实验目的 1. **理解变量**: 学习如何声明变量、初始化变量及变量的作用范围。 2. **数据类型掌握**: 包括基本数据类型...
【浙江大学C程上机题题库...总的来说,【浙江大学C程上机题题库答案】是一个全面且实用的学习资源,对于想要提升C语言编程技能的初学者来说,它提供了宝贵的实践机会和详尽的解答,有助于他们在编程之路上稳步前行。
MySQL上机考试题(习题,答案).docx
在【新建文件夹 (2)】中,可能包含了多个子文件或子文件夹,它们可能按照年份或者题型分类存放历年上机题的题目描述、输入输出样例以及参考解答。考生应该逐一打开并仔细阅读每个文件,理解每道题目的要求,分析其...
在解答Java编程上机试题时,考生应具备良好的编程习惯,注重代码的可读性和可维护性。同时,Oracle上机试题则更侧重于实际数据库操作和管理能力,要求对SQL语言有深入的理解。通过这些试题的练习,学习者可以提升...
在第3题中,我们可以看到一个字符串比较的例子,函数fun()的功能是逐个比较a、b两个字符串对应位置中的字符,把ASCII值小或相等的字符依次存放到c数组中,形成一个新的字符串。 知识点6:函数编程 在第3题中,我们...
在前端上机面试中,经常会遇到要求实现一系列交互功能,如数据渲染、筛选、分页以及导航等。根据提供的描述,以下是对这些知识点的详细解释: 1. **数据渲染**: - 使用JavaScript(通常结合HTML和CSS)来动态显示...