`
xandon01
  • 浏览: 2064 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

四则运算表达式

阅读更多
说明:Stack,和StirngStack,是工具类,协助编程
convertPRN是将中缀表达式转为后缀表达式
RPN是计算后缀表达式的值
 
1 statck接口 
package DataStruct.Stack; 
public interface Stack { 
public void push(Object k); 
public Object pop(); 
public boolean isEmpty(); 
public boolean isFull(); 
  public Object peek(); 

2  StringStack类 
package DataStruct.Stack.Sample; 
import DataStruct.Stack.*; 
public class StringStack implements Stack { 
private String[] s; 
private int top; 
private int MAX; 
public StringStack(int MAX) { 
  this.MAX = MAX; 
  s = new String[MAX]; 
  top = -1; 

public boolean isEmpty() { 
  return (top == -1); 

public boolean isFull() { 
  return (top == MAX - 1); 

public void push(Object k) { 
  s[++top] = k.toString(); 

public Object pop() { 
  return (Object) s[top--]; 

public Object peek() { 
  return (Object) s[top]; 


3 RPN类  用来计算后缀表达式的值 
/* 
* 计算RPN表示式的值 
* RPN即为:逆波兰表达式reverse polish notation 
* RPN rpn=new RPN("AB+C*"); 
* RPN rpn=new RPN("9 8 + 2 *"); 
*/ 
package DataStruct.Stack.Sample; 
import DataStruct.Stack.*; 
public class RPN { 
private String express; 
public RPN(String express) { 
  this.express = express; 

public int count() { 
  int result = 0;// 存放最终结果 
  int tr = 0;// 临时结果 
  Stack stack = new StringStack(100);// 构造一个栈 
  String[] s_array = express.split(" "); 
  String temp = null; 
  int p = 0; 
  int q = 0; 
  for (int i = 0; i < s_array.length; i++) { 
   temp = s_array[i].toString(); 
   // 如果是运算符计算 
   if (temp.equals("*") || temp.equals("/") || temp.equals("+") 
     || temp.equals("-")) { 
    p = Integer.parseInt(stack.pop().toString()); 
    q = Integer.parseInt(stack.pop().toString()); 
    char t = temp.charAt(0); 
    switch (t) { 
    case '*': 
     tr = p * q; 
     stack.push(String.valueOf(tr)); 
     break; 
    case '.': 
     tr = p / q; 
     stack.push(String.valueOf(tr)); 
     break; 
    case '+': 
     tr = p + q; 
     stack.push(String.valueOf(tr)); 
     break; 
    case '-': 
     tr = p - q; 
     stack.push(String.valueOf(tr)); 
     break; 
    } 
   } 
   // 否则入栈 
   else 
    stack.push(temp); 
  } 
  int r = Integer.parseInt(stack.pop().toString()); 
  return r; 

public static void main(String[] args) { 
  RPN rpn = new RPN("9 8 + 2 *"); 
  int r = rpn.count(); 
  System.out.println(r); 


4 convertRPN 将中缀表达式转换为后缀表达式 
/*
 * 将中缀表达式转成RPN 
 * 将(9+8)*2转为"9 8 + 2 *"
 */
package DataStruct.Stack.Sample;
import DataStruct.Stack.*;
public class ConvertRPN {
 private String express;
 private StringBuffer sb;
 public ConvertRPN(String express) {
  this.express = express;
  sb = new StringBuffer();
 }
 // 将中缀转换成后缀
 public String convert() {
  Stack s = new StringStack(100);
  String temp = null;//
  String[] ee = express.split(" ");
  // 从左到右扫描字符串
  for (int i = 0; i < ee.length; i++) {
   temp = ee[i];
   // 如果为操作符
   if (temp.equals("*") || temp.equals("/") || temp.equals("+")
     || temp.equals("-") || temp.equals("(") || temp.equals(")")) {
    char c = temp.charAt(0);
    switch (c) {
    //如果是')'则将栈的内容弹出附加到表达式中,直到遇到'('为止,并将'('弹出
    case ')':
     while (!s.peek().equals("(")) {
      addResult(s.pop());
     }
     s.pop();
     break;
    //如果是运算符,
    //如果栈不为空,并栈顶内容不为'(',则比较该运算符和栈顶运算符的优先级,如果大于直接入栈,否则先取栈顶内容,再入栈。
    //否则,直接将运算符入栈
    case '+':
    case '-':
    case '*':
    case '/':
     if (!s.isEmpty() && !s.peek().equals("(")) {
      if (compare(c, s.peek().toString().charAt(0))) {
       s.push(temp);
      } else {
       addResult(s.pop());
       s.push(temp);
      }
     } else
      s.push(temp);
     break;
    //如果运算符为‘(’,直接入栈
    case '(':
     s.push(temp);
     break;
    }
   }
   // 如果是数值则直接放入到表达式中
   else {
    addResult(temp);
   }
  }
  //最后将栈中的运算符依次附加在表达式后
  while (!s.isEmpty()) {
   addResult(s.pop());
  }
  return new String(sb);
 }
 // 将对象追加到表示式中
 private void addResult(Object o) {
  sb.append(o);
  sb.append(" ");
 }
 // 比较运算符的优先级,如果小于等于则返回false,
 // 如果大于则返回true;
 private boolean compare(char a, char b) {
  if (a == '*' || a == '/') {
   if (b == '+' || b == '-')
    return true;
  }
  return false;
 }
 public static void main(String[] args) {
  ConvertRPN c = new ConvertRPN("( 9 - 3 ) * ( 2 - 1 )");
  System.out.println(c.convert());
 }
}
分享到:
评论

相关推荐

    四则运算表达式解析器源码(C#)

    标题中的“四则运算表达式解析器源码(C#)”是指一个使用C#编程语言编写的程序,它的主要功能是解析包含加法(+)、减法(-)、乘法(*)、除法(/)、取模(%)以及比较运算符(&lt;、&gt;、=、、、&gt;=)的数学表达式。...

    四则运算表达式的转换并计算结果

    在IT领域,四则运算表达式的转换和计算是计算机科学中的基本问题,特别是在编译原理、数据结构和算法设计中。这里我们主要讨论如何将中缀表达式转换为后缀表达式(也称为逆波兰表示法)以及如何计算后缀表达式的结果...

    四则运算表达式计算器

    四则运算表达式计算器是一种能够处理加法、减法、乘法和除法的计算工具。在编程领域,实现这样的计算器通常涉及到解析表达式、计算数值以及处理可能的错误情况等多个方面。以下是对这个主题的详细说明: 1. **...

    C++四则运算表达式求值算法

    四则运算表达式求值算法是计算机科学中的基础概念,它涉及到解析和计算数学中的加法、减法、乘法和除法操作。这篇文章将深入探讨如何在C++中实现一个四则运算表达式求值的算法。 首先,我们需要理解表达式的解析...

    用栈来对一位数的四则运算表达式计算结果

    用栈来对一位数的四则运算表达式计算结果。 本文主要讲解如何使用栈来计算一位数的四则运算表达式的结果。栈是一种数据结构,通过使用栈,可以实现对表达式的计算。下面将详细讲解栈的使用、创建、进栈和出栈等操作...

    3_05 V4 (求解简单的四则运算表达式).cpp

    c++程序求解简单的四则运算表达式

    四则运算表达式求值

    按中缀形式输入一个四则运算的表达式,利用算法优选算法把其转换为后缀表达式输出,并求表达式的值。假设输入的表达式中的操作数都是1位整数。

    带括号的四则运算表达式js实现

    输入一个字符串形式的四则运算表达式,如"1.0+2.1*(3+4)" 直接谈出结果,输入在文件底部,自己写的。思路是先把中缀表达式转成后缀表达式,然后根据后缀表达式建立一个栈求出结果

    java运算四则运算表达式的程序

    输入一个四则运算表达式,本程序可计算出结果。另外还支持三角函数,对数运算,支持简单命令,如查看帮助和退出。输入help可查看详细情况。

    一个vs08编写的空项目,exe执行计算用四则运算表达式的值

    博主于16年4.19去面腾讯实习生,其中一个问题是让写一个函数求四则运算表达式的值,输入是字符串,输出为表达式结果。当时只记得这是数据结构里堆栈的应用,表达式要变顺序,但是实现就想不起来了,自然程序写的...

    四则运算表达式处理的栈实现(C++)

    四则运算表达式处理的栈实现,有详细注释,支持表达式预处理与合法性检查,供C++数据结构课程学习与交流使用。

    设计模式,四则运算表达式

    设计模式在四则运算表达式中的应用 本文将探讨设计模式在四则运算表达式中的应用,设计一个完成数学运算的计算器,计算器要实现四则运算、三角运算、倒数、乘方/开方这些基本运算,并使用抽象语法树显示计算的过程...

    实现整数四则运算表达式的词法分析程序

    实现的词法分析程序的功能是,接受一个表达式,输出该表达式中的各类单词符号。测试词法分析程序时,可以按照一定格式输出各类单词符号。 单词符号的种类和所属类型可定义如下 typedef enum Symbol { ERR = -1, END,...

    866008266581147四则运算表达式求值.zip

    在IT领域,四则运算表达式求值是一个基础但重要的概念,它涉及到计算机科学中的算法设计和编程语言处理。在日常编程中,我们经常需要计算包含加法(+)、减法(-)、乘法(*)和除法(/)的数学表达式。这些表达式...

    四则混合运算表达式处理

    本文将深入解析一个程序,该程序能够处理逆波兰表示法(也称为后缀表示法)的四则运算表达式,包括构建表达式树、输出表达式树的不同遍历方式以及最终删除表达式树。 #### 主要功能 1. **逆波兰表示法输入的算术...

    入一个简单的多位数(包含小数)四则运算表达式并输出

    任务1:如何输入一个简单的多位数(包含小数)四则运算表达式并输出 //分离一个多位操作数调用函数getValue()完成 学生分组讨论、编程实现 */ //计算多位整数四则运算表达式的值 "100.5+200.5-300.5" //定义...

Global site tag (gtag.js) - Google Analytics