zoukankan      html  css  js  c++  java
  • 【week2】结对编程-四则运算 及感想

    首先我要说一下,我得作业我尽力了,但是能力有限,还需练习。

    四则运算,改进代码流程:

    1.手动输入算式(属于中缀表达式)

    2.将中缀表达式转化成后缀表达式 生成out数组

    3.一个操作数栈,一个运算符栈,按照后缀表达式计算方法将out中的字符分别放入两个栈

    4.当操作数栈只有一个数时结束计算。

    代码分段解析如下:

    中缀变后缀:

    public List<String> SolveOrder(String[] in,HashMap<String,Integer>precedence){
    		//符合逆波兰式(后缀)的输出
    		List<String> out = new ArrayList<String>();
    		//操作符
    		Stack<String> ops= new Stack<String>();
    		for(int i=0;i<in.length;i++){
    			String s=in[i];
    			//碰见数值 就放进out数组末尾
    			if(!precedence.containsKey(in[i])){
    				out.add(s);
    				continue;
    			}
    			while(true){
    				//当存储操作符的栈中“空”或“遇见左括号”或“栈顶的运算符优先级
                                    // 小于读取字符串当前字符的优先级”时,符号入栈
    				if(ops.isEmpty()||s.equals("(")||(precedence.get(s)
                                     >precedence.get(ops.peek()))){
    					ops.push(s);
    					break;
    				}
    				String op=ops.pop();//出栈得运算符
    				if(op.equals("(")){
    					break;
    				}else{
    					out.add(op);
    				}
    			}
    		}
    		//若操作符栈不为空,就依次将剩余的操作符放入out数组
    		while(!ops.isEmpty()){
    			out.add(ops.pop());
    		}
    		return out;
    }                     
    

     根据后缀(逆波兰式)计算。

    public double calculateOut(String[] out) {
    	//假设满足逆波兰式的输出不为空却长度不为零
    	assert (out != null && out.length != 0);
    	//操作数栈
    	Stack<Double> stack = new Stack<Double>();
    	for (int i = 0; i < out.length; i++) {
    		if (isNumber(out[i])) {
    			stack.push(Double.parseDouble(out[i]));
    		} else {
    			double v1 = stack.pop();
    			double v2 = stack.pop();
    			double result = eval(out[i], v2, v1);
    			stack.push(result);
    		}
    	}
    	return stack.pop();
    }
    

     主函数:控制台输入完整算式。

        public static void main(String[] args) {
    		System.out.println("请输入要计算的算式:");
    		Scanner sc= new Scanner(System.in);
    		String inBefor = sc.nextLine();
    		String[] in=inBefor.split("");
    		Cal cc = new Cal();
    		HashMap<String, Integer> precedence=cc.priorityInfo();;
    		cc.SolveOrder(in, precedence);
    		System.out.println("所输入的算式结果为:"+cc.calculateOut(in));
    		
    	}
    

          老师,这段代码我是看的别人博客上写的,只能说我看懂了,还没到您要求的变成自己的,但是,老师 ,我实在写不动了。。

          关于结对编程,从上这门课是从无到有的认识。编程这种东西就像思想,两个人share就是两个人都有两种。争吵中才会进步。

    1.最开始的争论是关于用java还是c++?由于我俩未来可能想更多的使用java所以,最后决定用java。

    2.关于复杂运算有两种思想:对五个数字产生的四个运算符 进行讨论,四个位置分别讨论+—*/另一种就是使用堆栈进行计算,最后还是堆栈代码量比较小,选定!

    3.关于数字与符号的存储方式,一种是用类,一种是分为两个数组。用类,在处理数组与字符的int String类型上不方便,最后决定用两个数组。

    4.最后的代码加不加原来的两个操作数的代码,最后没加。

    5.代码还有一点问题,发不发博客?最后还是发了。。。

    结语:我去睡觉了,现在已经5:27了

    代码地址:https://git.coding.net/yumiaomiao/Arithmetic.git

    ssh:git@git.coding.net:yumiaomiao/Arithmetic.git

  • 相关阅读:
    07-汤姆猫
    快捷键
    UIImageView属性
    UIImagePickerController
    UIDatePicker
    并发编程简介
    区别值类型数据和引用类型数据
    用条件属性而不是#if
    选择is或者as操作符而不是做强制类型转换
    始终使用属性(Property),而不是字段(Data Member)
  • 原文地址:https://www.cnblogs.com/yumiaomiao/p/5874209.html
Copyright © 2011-2022 走看看