少了浏览器的支持,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
分享到:
- 2007-03-12 17:25
- 浏览 1930
- 评论(2)
- 论坛回复 / 浏览 (2 / 3038)
- 查看更多
相关推荐
他的applet W3Eval对表达式求值与您用纸笔计算的一系列步骤完全一致,但更快并且没有错误。 在了解W3Eval之前,我们需要了解表达式求值的经典算法。表达式求值的经典算法由Donald Knuth 描述于1962年,包括三个步骤...
4. **栈**:遵循后进先出(LIFO)原则,常用于函数调用、表达式求值等场景。栈可以用数组或链表实现。 5. **树**:是一种非线性数据结构,由节点和边组成,每个节点包含数据和对子节点的引用。二叉树是最常见的树...
最后,EX5涉及了GUI编程,使用Applet接收用户输入的华氏温度,并通过公式将其转换为摄氏温度。`ActionListener`接口处理按钮点击事件,`actionPerformed`方法中的计算逻辑即使用了运算符和表达式。 总的来说,变量...
栈遵循“后进先出”(LIFO)原则,常用于函数调用和表达式求值;队列则遵循“先进先出”(FIFO)原则,适用于任务调度;哈希表通过键值对快速查找,实现了近乎常数时间的查找效率;树结构如二叉树、AVL树、红黑树等...
在Java中,常量变量表达式是编程时常见的概念,它们涉及到如何定义、使用和管理不可变的数据。 1. 常量变量: 在Java中,常量是不可更改的值,通常使用关键字`final`来声明。例如: ```java final int MAX_SIZE = ...
4. **栈**:栈是一种后进先出(LIFO)的数据结构,常用于表达式求值、函数调用、回溯等场景。Java中的java.util.Stack类提供栈的操作。 5. **队列**:队列是一种先进先出(FIFO)的数据结构,常用于任务调度、消息...
实现优先级的关键在于理解和使用栈数据结构。栈是一种后进先出(LIFO)的数据结构,非常适合处理括号内的运算。当遇到运算符时,我们会检查其优先级,如果当前运算符的优先级高于栈顶运算符,我们就将其压入栈中;...
4. **栈与队列**:栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等场景;队列则是先进先出(FIFO)的数据结构,常见于任务调度、缓冲区管理等。 5. **树结构**:包括二叉树、平衡树(如AVL树、...
3. **栈与队列**:线性数据结构,栈遵循后进先出(LIFO)原则,常用于函数调用和表达式求值;队列遵循先进先出(FIFO)原则,常见于任务调度和缓冲区管理。 4. **树**:分层数据结构,如二叉树、平衡树(AVL树、...
- **栈**:后进先出(LIFO)结构,主要用于函数调用、表达式求值等场景。 - **队列**:先进先出(FIFO)结构,用于模拟处理任务的顺序。 - **堆**:一种特殊的树形数据结构,通常实现优先队列,满足最大堆或最小...
栈遵循“后进先出”(LIFO)原则,常用于表达式求值、递归等;队列遵循“先进先出”(FIFO)原则,常见于任务调度、缓冲区管理等。 4. **集合框架**:Java的集合框架包括接口(如List、Set、Queue)和实现类(如...
栈是后进先出(LIFO)的数据结构,常用于函数调用和表达式求值;队列则是先进先出(FIFO)的数据结构,适用于任务调度和消息传递;树形结构如二叉树在搜索、排序等领域广泛应用;图则用于表示复杂的相互关联关系。 ...
栈是一种后进先出(LIFO)的数据结构,常用于表达式求值,如计算括号内的表达式或处理运算符优先级;而队列则是一种先进先出(FIFO)的数据结构,可能在此处用于存储运算结果或处理操作符的顺序。 `main.cpp` 文件...
- `(y++)/6` 的值取决于y的具体值,因为y++是在表达式求值后增加。 6. **逻辑运算符**: - `x的逻辑值可能是`true`或`false`,`x>=y`的逻辑值同样可能是`true`或``false`,具体取决于x和y的值。 7. **抽象方法**...
3. **表达式求值**:表达式`y+=z--/++x`涉及到运算符优先级和后缀、前缀增量/减量操作。在这个例子中,先执行`++x`,然后是`z--`,因此表达式的值取决于变量的初始值。不过,由于具体数值未给出,无法确定确切答案。...
在这个“用JSP实现显示时钟”的主题中,我们将深入探讨如何使用JSP来构建一个实时更新的时钟应用。 首先,`ClockApplet.jsp`是我们的主要JSP文件,它会包含用于展示时钟的HTML结构以及Java代码。JSP文件通常包含两...