• 第九周(11.11-11.17)----结对项目----实现任意位置加一对括号


      为了可以出带括号的题目,我学习了以往同学的作业。庆幸的是出题的要求只是出四个数进行运算就行,这样就大大缩减了这个功能的难度。

      只有一对括号出现可以有以下几种情况:

      1+1+1+1;

      (1+1)+1+1;

      (1+1+1)+1;

      1+(1+1)+1;

      1+(1+1+1);

      1+1+(1+1);

      所以在主类中编写了swich(i),这里的 i 是1-6的随机数,将会在上述的六种情况中随机挑选出一种。想利用这个中方法出带括号的题目,把原式从String数组类型改为String类型。

     1      String zhongshi = "";        
     2         int i = 0;
     3         i = (int)(Math.random()*6)+1;
     4         switch(i)
     5         {
     6                   
     7              case 1:    
     8                  zhongshi = "("+String.valueOf(y1)+sym1+String.valueOf(y2)+")"+sym2+String.valueOf(y3)+sym3+String.valueOf(y4);
     9                  break;     
    10              case 2:    
    11                  zhongshi = "("+String.valueOf(y1)+sym1+String.valueOf(y2)+sym2+String.valueOf(y3)+")"+sym3+String.valueOf(y4);
    12                  break;
    13              case 3:    
    14                  zhongshi = String.valueOf(y1)+sym1+"("+String.valueOf(y2)+sym2+String.valueOf(y3)+")"+sym3+String.valueOf(y4);
    15                  break;
    16              case 4:    
    17                  zhongshi = String.valueOf(y1)+sym1+"("+String.valueOf(y2)+sym2+String.valueOf(y3)+sym3+String.valueOf(y4)+")";
    18                  break;
    19              case 5:     
    20                  zhongshi = String.valueOf(y1)+sym1+String.valueOf(y2)+sym2+"("+String.valueOf(y3)+sym3+String.valueOf(y4)+")";
    21                  break;
    22              case 6:
    23                  zhongshi = String.valueOf(y1)+sym1+String.valueOf(y2)+sym2+String.valueOf(y3)+sym3+String.valueOf(y4);
    24           
    25         }

    为此,我将原来中缀遍历的转换后缀遍历的函数toback形参类型换成了String,这样的变化使得原来遍历字符串数组的方法不能用了,于是在网上找到了String类型下substring(int a,int b)方法。这个可以实现这样一种功能。从字符串的第一位开始记数,第一位记零,substring(int a,int b)是从a开始(这里a指的不是第几位,而是下标序号,从零开始),到b之前截止(这里的b也是指下标,而且不算b),截取原字符串。通过这个方法就可以遍历字符串的每个字符。最后通过获取操作符栈的大小,FOR循环将每个字符相加得到字符串类型的后缀表达式。

     1     public String toback(String pre){
     2         
     3         String bottom = "#";
     4         
     5         Stack<String> OPTR = new Stack();   //运算符栈
     6         Stack<String> OPND = new Stack();   //数据栈
     7         
     8        OPTR.push(bottom);    // 首先把结束标志‘#’放入栈底
     9         
    10         for(int k=0;k<pre.length();k++)
    11         {
    12             if(isNum(pre.substring(k,k+1))) // 遇到数直接写入后缀表达式
    13             {
    14                 OPND.push(pre.substring(k,k+1));
    15             }
    16             else if(pre.substring(k,k+1).equals("("))    // 遇到“(”不用比较直接入栈
    17                 OPTR.push(pre.substring(k,k+1));
    18             else if(pre.substring(k,k+1).equals(")"))  // 遇到右括号将其对应左括号后的操作符(操作符栈中的)全部写入后缀表达式
    19             {
    20                 while(!OPTR.peek().equals("("))
    21                 {
    22                     OPND.push( OPTR.peek());
    23                     OPTR.pop();
    24                 }
    25                 OPTR.pop(); // 将“(”出栈,后缀表达式中不含小括号
    26             }
    27             else if (isoperator(pre.substring(k,k+1)))
    28             {
    29                  while(!OPTR.empty() && priority(pre.substring(k,k+1)) <= priority(OPTR.peek()))
    30                  {
    31                      // 当前的操作符小于等于栈顶操作符的优先级时,将栈顶操作符写入到后缀表达式,重复此过程
    32                      OPND.push(OPTR.peek());
    33                      OPTR.pop();
    34                  }
    35                  OPTR.push(pre.substring(k,k+1));// 当前操作符栈为空或者当前操作符优先级大于栈顶操作符的优先级,将该操作符入栈
    36             }
    37                     
    38             
    39 
    40            
    41         }
    42         while(OPTR.peek() != "#") // 将所有的操作符加入后缀表达式
    43         {
    44             OPND.push(OPTR.peek());
    45             OPTR.pop();
    46         }
    47         OPTR.pop();
    48 
    49         //利用操作符栈逆序即可得到后缀表达式
    50         while(!OPND.empty())
    51         {
    52             OPTR.push(OPND.peek());
    53             OPND.pop();
    54         }
    55         //后缀表达式的的存储数组 
    56         String back = "";
    57         int j = OPTR.size();
    58         for(int i = 0; i<j;i++)
    59         {    
    60             
    61             back+=OPTR.peek();
    62             OPTR.pop();
    63 
    64         }
    65         //将String数组转换成字符串
    66 
    67         return back;
    68         
    69 
    70     }

    运行结果:

  • 相关阅读:
    深拷贝与浅拷贝+可变与不可变的数据类型
    列表+列表循环+列表切片+元祖
    接口+session与cookie的区别+http状态码
    JSP中文乱码问题终极解决方案
    关于AS使用git的那些奇葩事儿
    ListView中动态显示隐藏HeaderView和FooterView
    关于沉浸式的那些奇葩问题
    Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析
    快速搭建tab
    使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中<meta-data>变量的值
  • 原文地址:https://www.cnblogs.com/YangXiaomoo/p/6060269.html
Copyright © 2020-2023  润新知