简单四则运算表达式的java实现

思路:

  1  将表达式转换成后缀表达式

  2 利用栈计算后缀表达式

/**
       * 计算数值
       * @param text
       * @return
       */
      public static int count(String text)
      {
          Queue<String> queue=changeToPostOrder(text);
          Stack<Integer> stack=new Stack<>();
          int result=0;
          while(!queue.isEmpty())
          {
              String t=queue.poll();
              if(t.length()>1)//数字
              {
                  stack.push(Integer.parseInt(t));
              }
              else if(t.length()==1)
              {
                  if(isYunsuanfu(t))
                  {
                      char c=t.charAt(0);
                      int ri=stack.pop();
                      int li=stack.pop();
                      switch (c) {
                    case ‘+‘:
                        result=li+ri;
                        stack.push(result);
                        break;
                    case ‘-‘:
                        result=li-ri;
                        stack.push(result);
                        break;
                    case ‘*‘:
                        result=li*ri;
                        stack.push(result);
                        break;
                    case ‘/‘:
                        result=li/ri;
                        stack.push(result);
                        break;
                    default:
                        break;
                    }
                  }
                  else
                  {
                      stack.push(Integer.parseInt(t));
                }
            }
          }
          return stack.empty()?0:stack.pop();
      }

      //change to post order
      /**
       * 遇到数字直接输出,遇到符号,假如是高于栈顶优先级如乘除就直接压栈,
       * 假如是低于或等于栈顶优先级或者是右括号直接输出栈顶直到左括号,再压栈
       * @param text
       * @return
       */
      public static Queue<String> changeToPostOrder(String text)
      {
          Queue<String> queue=new LinkedList<>();
          Stack<Character> stack=new Stack<>();
          StringBuilder temp=new StringBuilder();
          int len=text.length();
          for(int i=0;i<len;i++)
          {
              char c=text.charAt(i);
              if (isNumber(c)) {
                temp.append(c);
                if(i==len-1)
                {
                    queue.offer(temp.toString());
                }
            }else {
                //如果是右括号  直接输出直到左括号
                if(temp.length()!=0)
                {
                    queue.offer(temp.toString());
                    temp.delete(0, temp.length());
                }
                if(c==‘)‘)
                {
                    while(stack.peek()!=‘(‘)
                    {
                        queue.offer(stack.pop()+"");
                    }
                    //弹出左括号
                    stack.pop();
                    continue;
                }
                //如果栈为空直接压栈
                if(stack.empty() || c==‘(‘)
                {
                    stack.push(c);
                    continue;
                }

                //优先级比较  高优先级 压栈
                while(!stack.empty() && !isHigher(c, stack.peek()))
                {
                    queue.offer(stack.pop()+"");
                }
                stack.push(c);
            }
          }
          while(!stack.empty())
          {
              queue.offer(stack.pop()+"");
          }
          return queue;
      }

      public static boolean isNumber(char c)
      {
          return c>=‘0‘ && c<=‘9‘;
      }

      public static boolean isYunsuanfu(String s)
      {
          return s.equals("*") || s.equals("/") || s.equals("+") || s.equals("-");
      }

      public static boolean isHigher(char c,char cmp)
      {
          return priority(c)>priority(cmp);
      }

      public static int priority(char c)
      {
          int p=0;
          switch (c) {
        case ‘*‘:
            p=2;
            break;
        case ‘/‘:
            p=2;
            break;
        case ‘+‘:
            p=1;
            break;
        case ‘-‘:
            p=1;
            break;
        default:
            break;
        }
          return p;
      }

程序很罗嗦,有空再写一遍!

时间: 2024-10-09 01:52:09

简单四则运算表达式的java实现的相关文章

简单四则运算表达式的java实现(2)

网上看到的一种很给力的实现方法,利用递归. /** * 思路 * 1.排除空字符串 * 2.得到第一个符号的索引 * 3.假如只存在数字,直接转换并返回 * 4.假如存在左括号,则找到右括号,并将括号里面的字符串递归计算,并替换,然后整体递归,去掉所有括号 * 5.先递归分解加减,保证乘除的优先级 * 6.再递归分解乘除,乘除计算完后会自动的回溯计算加减 * @param s * @return * @throws Exception */ public static float opt(Str

java stack实现的中缀简单四则运算表达式计算

public abstract class Stack<T> { public abstract boolean isEmpty(); public abstract boolean isFull(); public abstract T top(); public abstract boolean push(T x); public abstract T pop(); public abstract void clear(); } public class SeqStack<T>

简单四则运算

问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 3.1.表达式只含 +, -, *, / 四则运算符,不含括号 3.2.表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3.3.要考虑加减乘除按通常四则运算规定的计算优先级 3.4.除法用整数除法,即仅保留除法运算结果的整数部分.比如8/3=2.输入表达式保证无0作为除数情况发生 3.5.输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现

华为机考--简单四则运算

问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 1.表达式只含 +, -, *, / 四则运算符,不含括号 2.表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3.要考虑加减乘除按通常四则运算规定的计算优先级 4.除法用整数除法,即仅保留除法运算结果的整数部分.比如8/3=2.输入表达式保证无0作为除数情况发生 5.输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况 要求实

Java实验项目二——小学生考试系统(简单四则运算)

Program:设计实现一个小学生数学考试系统,完成随机出题(简单的四则运算),学生答题,自动判分的功能. Description:代码如下: 1 /* 2 * Description:面向考试系统建立类TestSystem 3 * 4 * */ 5 6 package entity; 7 8 public class TestSystem { 9 10 private int num1; //声明两个操作数 11 private int num2; 12 private String oper

Java四则运算表达式求解

压栈思想计算Java运算表达式 栈的规则是先进后出.利用压栈的思想来计算四则运算表达式是这样的:我们给定两个栈,一个用来存放数字.一个用来存放对应的操作符.假定我们有一个给定的四则运算表达式a+b+c/d*(e+f)-d*a,那我们先把这个表达式拆分成一个个的数字或者是运算符.或者就是括号了.然后我们从左至右遍历每一个元素,遍历过程中遵循步骤和原则如下: (1)遇到数字则直接压到数字栈顶. (2)遇到运算符(+-*/)时,若操作符栈为空,则直接放到操作符栈顶,否则,见(3). (3)若操作符栈顶

计算四则运算表达式(Java语言实现)

计算四则运算表达式主要是分两步运算  第一步是把 中缀表达式 转换成 后缀表达式.参考大一下期学的 <数据结构与算法分析--C语言描述>3.3.3 教材,完成下列代码: static String mid_to_suf(String str){ Stack<Character> s = new Stack<Character>(); String suf = new String(); HashMap<Character, Integer> map = ne

结对项目--四则运算生成器(Java) 刘彦享+龙俊健

结对项目--四则运算生成器(Java) GitHub地址 合作者 刘彦享(3118005010) 龙俊健(3118005011) https://github.com/LYX708194/calculate 一.项目简介 说明 自然数:0, 1, 2, -. 真分数:1/2, 1/3, 2/3, 1/4, 1'1/2, -. 运算符:+, ?, ×, ÷. 括号:(, ). 等号:=. 分隔符:空格(用于四则运算符和等号前后). 算术表达式: e = n | e1 + e2 | e1 ? e2

2nd 简单四则运算更新

简单四则运算更新 功能:由随机数决定出题为10个以内的数字,并确定是否出现括号(仅限一对),顺序输出表达式,并用栈的方式进行计算,判断正误.其他功能有待进一步实现. 头文件 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <math.h> 栈的结构体 typedef struct stack { double * e; in