`
cavenaghi
  • 浏览: 13971 次
  • 性别: Icon_minigender_1
  • 来自: 辽宁抚顺
最近访客 更多访客>>
社区版块
存档分类
最新评论

用Applet实现表达式求值

    博客分类:
  • J2SE
阅读更多
少了浏览器的支持,Applet在互联网上永远不会有自己的舞台,而我却很酷爱这种把应用程序放到界面里的东东,今天无聊,把以前写过的一个表达式求值的程序,顺手拿Applet改写一下,再让大家体验一下MVC设计模式的应用吧:


=======================ExpressionModel===================
/*
 *这个就是表达式的模型组件了,它的三个属性,分别代表了它的中则表达式和右则表达式
 *而那两个属性分别是输入的式子和得到的结果
 */
package expression;

import java.text.*;
import java.util.*;

public class ExpressionModel extends Observable
{
 
 private ArrayList<String> middle;
 private ArrayList<String> right;
 private String input, result;

 public ExpressionModel()
 {
  middle = new ArrayList<String>();
  right = new ArrayList<String>();
 }

 //判断一个字符是不是操作符
 private boolean isOperator( String op )
 {
  if( op.equals("+") || op.equals("-") || op.equals("%")
     ||op.equals("*")|| op.equals("/") || op.equals("(")
     ||op.equals(")") )
    return true;
    
  else return false;
 }

 //得到一个操作符的优先级
 private int priority( String op )
 {
  if( op.equals("+") || op.equals("-") || op.equals("(") ) 
   return 1;
  else if( op.equals("*") || op.equals("/") || op.equals("%") ) 
   return 2;
  else 
   return 0;
 }
 

//计算两个数和一个运算符得到的结果
 private String calTwoNumber( String op, String a, String b ) throws Exception
 {
  double x = Double.parseDouble( b );
  double y = Double.parseDouble( a );
  double z = 0;
  
  if( op.equals("+") ) 
   z = x + y;
  else if( op.equals("-") ) 
   z = x - y;
  else if( op.equals("*") ) 
   z = x * y;
  else if( op.equals("/") ) 
   z = x / y;
  else if( op.equals("%") ) 
   z = x % y;
  else 
   z=0;
  
  return Double.toString( z );
 }
 
//将我们输入的中则表达式转换成逆波兰式
 private void turnToRight()
 {
  MyStack stack = new MyStack();
  String op;
  int pos = 0;
  
  StringTokenizer st = new StringTokenizer(input,"+-*/%()",true);
  
  while( st.hasMoreElements() )
   middle.add( st.nextToken() );
  
  while(true)
  {
   if( isOperator( middle.get(pos) ) )
   {
    if( stack.getTop() == -1 || (middle.get(pos)).equals("(") )
    {
     stack.push( middle.get(pos) );
    }
    else
    {
     if( (middle.get(pos)).equals(")") )
     {
      if( !(stack.top()).equals("(") )
      {
       op = stack.pop();
       right.add(op);
      }
     }
     else
     {
      if( priority(middle.get(pos)) <= priority(stack.top()) && stack.getTop() != -1 )
      {
       op = stack.pop();
       if( !op.equals("(") ) 
        right.add(op);
      }
      stack.push( middle.get(pos) );
     }
    }
   }
   else 
    right.add( middle.get(pos) );
   pos++;
   if( pos >= middle.size() ) 
    break;
  }
  
  while( stack.getTop() != -1 )
  {
   op = stack.pop();
   right.add(op);
  }
 }

 private void calculate( String expression ) throws Exception
 {
  input = expression;
  
  turnToRight();
  
  MyStack stack = new MyStack();
  String op1, op2, is = null;
  Iterator<String> it = right.iterator();
  
  while(it.hasNext())
  {
   is = it.next();
   if( isOperator(is) )
   {
    op1 = stack.pop();
    op2 = stack.pop();
    stack.push( calTwoNumber(is,op1,op2) );
   }
   else stack.push(is);
  }
  
  NumberFormat form = NumberFormat.getInstance();
  form.setMaximumFractionDigits(5);
  
  result = input + "=" + form.format( Double.parseDouble( stack.pop() ) );
  
  setChanged();
  notifyObservers();
 }
 
 public void input(String expression) throws Exception
 {
  calculate(expression);
  middle.clear();
  right.clear();
 }
 
 public String getResult(){
  return result;
 }
 
}



===============MyStack==============

//我们用到的自己的堆栈
package expression;

import java.util.*;

public class MyStack
{
 
 private LinkedList<String> list;
 private int top;
 
 public MyStack() 
 {
  list = new LinkedList<String>();
  top = -1;
 }
  
 public void push(String value)
 {
  top++;
  list.addFirst(value);
 }
 
 public String pop()
 {
  String temp = list.getFirst();
  top--;
  list.removeFirst();
  return temp;
 }
 
 public String top()
 {
  return list.getFirst();
 }
 
 public int getTop()
 {
  return top;
 }
 
}


===============ExpressionController========------

//控制器组件,包括一个输入域和两个按纽

package expression;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ExpressionController extends JPanel 
{
 
 private ExpressionModel expressionModel;   
 private JTextField calTextField;
 
 public ExpressionController( ExpressionModel controllerModel ) {
  
  super();
  
  expressionModel = controllerModel;
  
  calTextField = new JTextField( 15 );
  JButton calButton = new JButton( "计算" );
  JButton delButton = new JButton( "取消" );
  
  calButton.addActionListener(
   new ActionListener() 
   {
    public void actionPerformed( ActionEvent event ) 
    {
     try 
     {
      expressionModel.input( calTextField.getText() );
      calTextField.setText("");
     }
     catch ( Exception exception ) 
     {
      JOptionPane.showMessageDialog ( 
       ExpressionController.this, 
       "请输入有效表达式!", "错误", 
       JOptionPane.ERROR_MESSAGE );
      calTextField.setText("");
     }
    }
   }
  );
  
  delButton.addActionListener(
   new ActionListener() 
   {
    public void actionPerformed( ActionEvent event ) 
    {
     try 
     {
      calTextField.setText("");
     }
     catch ( Exception exception ) 
     {
      calTextField.setText("");
     }
    }
   }
  );
  
  setLayout( new FlowLayout() );
  
  add( calTextField );
  add( calButton );
  add( delButton );
 
 }
 
 public Dimension getPreferredSize() 
 {
  return new Dimension( 320, 40 );
 }
 
 public Dimension getMinimumSize() 
 {
  return getPreferredSize();
 }
 
 public Dimension getMaximumSize() 
 {
  return getPreferredSize();
 }
 
}



================ExpressionView ==================
//用来显示结果的视图
package expression;

import java.awt.*;
import java.text.*;
import java.util.*;

import javax.swing.*;
import javax.swing.border.*;

public class ExpressionView extends JPanel implements Observer 
{
 
 private ExpressionModel expressionModel;
 private JLabel display = new JLabel();
 
 public ExpressionView( ExpressionModel model ) {
  
  if( model == null ) 
   throw new NullPointerException();
  
  expressionModel = model;
  expressionModel.addObserver( this );
  
  add( display );
  
  setBackground( Color.white );
  setBorder( new MatteBorder( 1, 1, 1, 1, Color.black ) );
  
 }
 
 public void update( Observable observable, Object object ) 
 {
  display.setText( expressionModel.getResult() );
 }
 
 public Dimension getPreferredSize() 
 {
  return new Dimension( 320, 60 );
 }
 
 public Dimension getMinimumSize() 
 {
  return getPreferredSize();
 }
 
 public Dimension getMaximumSize() 
 {
  return getPreferredSize();
 }
 
 
}




===================Expression=====================

//最后把这些组装到这里吧

package expression;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*;

public class Expression extends JApplet 
{
   
 public void init() 
 {
  ExpressionModel model = new ExpressionModel();
  ExpressionView view = new ExpressionView( model );
  ExpressionController controller = new ExpressionController( model );
  
  Container contentPane = getContentPane();
  contentPane.add( view, BorderLayout.CENTER );
  contentPane.add( controller, BorderLayout.SOUTH );
  
  setSize( 320, 100 );
  
 }
   
}


把这几个类打包到一个jar文件后,再创建个htm文件来访问它

<object
    classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
    codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,5"
    WIDTH = 320 HEIGHT = 100 >
    <PARAM NAME = CODE VALUE = "expression.Expression" >
    <PARAM NAME = ARCHIVE VALUE = "expression.jar" >
    <param name = "type" value = "application/x-java-applet;version=1.5">
    <param name = "scriptable" value = "false">
</object>

这样就行了,不过你的机器需要安装jre 5

分享到:
评论
2 楼 cavenaghi 2007-03-12  
呵呵,不好意思噢
1 楼 jamesby 2007-03-12  
楼主,编辑下,用code标签

相关推荐

    前缀、中缀、后缀表达式[参照].pdf

    他的applet W3Eval对表达式求值与您用纸笔计算的一系列步骤完全一致,但更快并且没有错误。 在了解W3Eval之前,我们需要了解表达式求值的经典算法。表达式求值的经典算法由Donald Knuth 描述于1962年,包括三个步骤...

    Java 数据结构 applet演示

    4. **栈**:遵循后进先出(LIFO)原则,常用于函数调用、表达式求值等场景。栈可以用数组或链表实现。 5. **树**:是一种非线性数据结构,由节点和边组成,每个节点包含数据和对子节点的引用。二叉树是最常见的树...

    变量、运算符、表达式

    最后,EX5涉及了GUI编程,使用Applet接收用户输入的华氏温度,并通过公式将其转换为摄氏温度。`ActionListener`接口处理按钮点击事件,`actionPerformed`方法中的计算逻辑即使用了运算符和表达式。 总的来说,变量...

    Java数据结构和算法(含示例代码及Applet)

    栈遵循“后进先出”(LIFO)原则,常用于函数调用和表达式求值;队列则遵循“先进先出”(FIFO)原则,适用于任务调度;哈希表通过键值对快速查找,实现了近乎常数时间的查找效率;树结构如二叉树、AVL树、红黑树等...

    java常量变量表达式

    在Java中,常量变量表达式是编程时常见的概念,它们涉及到如何定义、使用和管理不可变的数据。 1. 常量变量: 在Java中,常量是不可更改的值,通常使用关键字`final`来声明。例如: ```java final int MAX_SIZE = ...

    Java数据结构和算法.(第二版) applet程序

    4. **栈**:栈是一种后进先出(LIFO)的数据结构,常用于表达式求值、函数调用、回溯等场景。Java中的java.util.Stack类提供栈的操作。 5. **队列**:队列是一种先进先出(FIFO)的数据结构,常用于任务调度、消息...

    java简易计算器(四则运算、三角函数、实现优先级)

    实现优先级的关键在于理解和使用栈数据结构。栈是一种后进先出(LIFO)的数据结构,非常适合处理括号内的运算。当遇到运算符时,我们会检查其优先级,如果当前运算符的优先级高于栈顶运算符,我们就将其压入栈中;...

    Java数据结构和算法(第二版)+随书源代码+applet小程序

    4. **栈与队列**:栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等场景;队列则是先进先出(FIFO)的数据结构,常见于任务调度、缓冲区管理等。 5. **树结构**:包括二叉树、平衡树(如AVL树、...

    java数据结构第二版(附源码和applet演示)

    3. **栈与队列**:线性数据结构,栈遵循后进先出(LIFO)原则,常用于函数调用和表达式求值;队列遵循先进先出(FIFO)原则,常见于任务调度和缓冲区管理。 4. **树**:分层数据结构,如二叉树、平衡树(AVL树、...

    Java数据结构与算法中的源代码和applet

    - **栈**:后进先出(LIFO)结构,主要用于函数调用、表达式求值等场景。 - **队列**:先进先出(FIFO)结构,用于模拟处理任务的顺序。 - **堆**:一种特殊的树形数据结构,通常实现优先队列,满足最大堆或最小...

    java数据结构源码和applet演示

    栈遵循“后进先出”(LIFO)原则,常用于表达式求值、递归等;队列遵循“先进先出”(FIFO)原则,常见于任务调度、缓冲区管理等。 4. **集合框架**:Java的集合框架包括接口(如List、Set、Queue)和实现类(如...

    Java数据结构与算法 中的源代码和applet

    栈是后进先出(LIFO)的数据结构,常用于函数调用和表达式求值;队列则是先进先出(FIFO)的数据结构,适用于任务调度和消息传递;树形结构如二叉树在搜索、排序等领域广泛应用;图则用于表示复杂的相互关联关系。 ...

    简单计算器的实现(数据结构 修正版)

    栈是一种后进先出(LIFO)的数据结构,常用于表达式求值,如计算括号内的表达式或处理运算符优先级;而队列则是一种先进先出(FIFO)的数据结构,可能在此处用于存储运算结果或处理操作符的顺序。 `main.cpp` 文件...

    JAVA程序的设计练习测试题与参考答案.doc

    - `(y++)/6` 的值取决于y的具体值,因为y++是在表达式求值后增加。 6. **逻辑运算符**: - `x的逻辑值可能是`true`或`false`,`x&gt;=y`的逻辑值同样可能是`true`或``false`,具体取决于x和y的值。 7. **抽象方法**...

    JAVA语言笔试题目

    3. **表达式求值**:表达式`y+=z--/++x`涉及到运算符优先级和后缀、前缀增量/减量操作。在这个例子中,先执行`++x`,然后是`z--`,因此表达式的值取决于变量的初始值。不过,由于具体数值未给出,无法确定确切答案。...

    用JSP实现显示时钟

    在这个“用JSP实现显示时钟”的主题中,我们将深入探讨如何使用JSP来构建一个实时更新的时钟应用。 首先,`ClockApplet.jsp`是我们的主要JSP文件,它会包含用于展示时钟的HTML结构以及Java代码。JSP文件通常包含两...

Global site tag (gtag.js) - Google Analytics