急,第一次做小项目,在结尾的时候遇到如此问题。。。。。

caofeng891102 2010-01-29 09:09:25
我的程序一共三个类:
第一个类:
package caofeng;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Calculator implements ActionListener{
private String str = "";
private JTextArea jtf;
private JFrame frame;
private Container contentPane;
private String []names={"1","2","3","+","退格",
"4","5","6","-","刷新",
"7","8","9","*",".",
"0","(",")","/","="
};
private JButton []buttons=new JButton[20];
public Calculator(){ //构造方法
frame=new JFrame("Calculator"); //定义一个框架
contentPane=frame.getContentPane(); //获取内容格

JPanel jp1=new JPanel(); //定义一个面板
jtf=new JTextArea("",7,43);
jtf.setEditable(false);
jp1.add(jtf);

JPanel jp2=new JPanel();
jp2.setLayout(new GridLayout(4,5,5,5)); //设置布局管理器
this.fillJP2(jp2);

contentPane.add(jp1,BorderLayout.NORTH);
contentPane.add(jp2,BorderLayout.SOUTH);

frame.setSize(500,300);
frame.setVisible(true);
}

private void fillJP2(JPanel j){ //添加组件
for(int i=0;i<names.length;i++){
buttons[i]=new JButton(names[i]);
j.add(buttons[i]);
buttons[i].addActionListener(this);
}
}

private boolean isQiTa(String str) {
if (str.equals("刷新") || str.equals("退格"))
return true;
return false;
}

public void actionPerformed(ActionEvent e){ //事件处理
String strCommand = e.getActionCommand();
if (!isQiTa(strCommand)&&!strCommand.equals("=")) {
str += strCommand;
jtf.setText(str);
}
if (strCommand == "退格") {
if (str == "")
jtf.setText("到头了,你还退什么退啊");
else {
if (str.length() == 1){
str ="";
jtf.setText(str);
}
else {
str = str.substring(0, str.length() - 1);
jtf.setText(str);
}
}
} else if (strCommand == "刷新") {
str="";
jtf.setText(str);
}else if(strCommand.equals("=")){
str+="=";
/////////////////////////////////
float f=new DealwithString().dealwithString(str); //调用
/////////////////////////////////
str+=f;
jtf.setText(str);
}
}

public static void main(String args[]){
new Calculator();
}

}


第二个类:
package caofeng;

import java.util.LinkedList;
import java.util.Queue;

public class DealwithString {
private String num = "";
private String s = "";
private Queue<String> queue = new LinkedList<String>();

private boolean isNum(String str) {
if (str.equals("0") || str.equals("1") || str.equals("2")
|| str.equals("3") || str.equals("4") || str.equals("5")
|| str.equals("6") || str.equals("7") || str.equals("8")
|| str.equals("9") || str.equals("."))
return true;
else
return false;
}

private boolean isFuHao(String str) {
if (str.equals("+") || str.equals("-") || str.equals("*")
|| str.equals("/") || str.equals("(") || str.equals(")"))
return true;
else
return false;
}

public float dealwithString(String str) {
float f = 0;
for (int i = 0; i < str.length(); i++) {
s = str.charAt(i) + "";

if (s.equals("=")) {
if (num != "") {
queue.add(num);
queue.add(s);
num = "";
}

else {
queue.add(s);
}
}
if (isNum(s)) {
num += s;
}

else if (isFuHao(s)) {
if (num != "") {
queue.add(num);
queue.add(s);
num = "";
} else
queue.add(s);
}
}
for(String s:queue)
System.out.print(s+" ");
System.out.println();
////////////调用////////////////////
JiSuan js=new JiSuan();
f=js.evaluateExpression(queue);
///////////////////////////
return f;
}

public static void main(String args[]) {
DealwithString ds = new DealwithString();
//ds.dealwithString("1.2+(12+3)/2=");
}
}


第三个类:
package caofeng;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;


public class JiSuan {

private String precede(String s1,String s2){ //进行优先级判断
String s3="";
char c1=s1.charAt(0);
char c2=s2.charAt(0);
switch(c2){
case '+':
case '-':
if(c1=='('||c1=='=')
s3="<";
else
s3=">";
break;
case '*':
case '/':
if(c1=='*'||c1=='/'||c1==')')
s3=">";
else
s3="<";
break;
case '(':
if(c1==')')
s3="括号不匹配";
else
s3="<";
break;
case ')':
if(c1=='(')
s3="=";
else if(c1=='=')
s3="括号不匹配";
else
s3=">";
break;
case '=':
if(c1=='=')
s3="=";
else if(c1=='(')
s3="括号不匹配";
else
s3=">";
break;
}
return s3;
}

private boolean in(String s){ //判断s是否为六种运算符之一,是返回true,否则返回false
char c=s.charAt(0);
switch(c){
case '+':
case '-':
case '*':
case '/':
case '(':
case '=':
case ')':return true;
default: return false;
}
}

private float operate(float f1,String s,float f2){ //计算操作
char c=s.charAt(0);
switch(c){
case '+':return f1+f2;
case '-':return f1-f2;
case '*':return f1*f2;
default :return f1/f2;
}
}

public float evaluateExpression(Queue<String> queue){ //计算主体

for(String s:queue){
System.out.print(s+" ");
}

Stack<String> stackNUM=new Stack<String>(); //数字栈
Stack<String> stack2EXP=new Stack<String>(); //符号栈

stack2EXP.add("=");
String q=queue.poll(); //从队列头部取一个元素
String s1=stack2EXP.peek();//获取栈顶元素
while(q!="="||s1!="="){
if(in(q))
switch(precede(s1,q).charAt(0)){
case '<':stack2EXP.add(q);q=queue.poll();break;
case '=':stack2EXP.pop();q=queue.poll();break;
case '>':String stemp=stack2EXP.pop();float f2=Float.parseFloat(stackNUM.pop());
float f1=Float.parseFloat(stackNUM.pop());stackNUM.add(operate(f1,stemp,f2)+"");
break;
}
else{
stackNUM.add(q);
q=queue.poll();
}
s1=stack2EXP.peek();
}
return Float.parseFloat(stackNUM.pop());
}

public static void main(String args[]){ //测试方法
Queue<String> queue=new LinkedList<String>();
queue.add("1.2");
queue.add("+");
queue.add("(");
queue.add("2");
queue.add("+");
queue.add("3");
queue.add(")");
queue.add("/");
queue.add("2");
queue.add("=");
JiSuan js=new JiSuan();
System.out.println(js.evaluateExpression(queue));
}
}



我运行第一个Calculator 类:
结果:


我用按钮输入如下:


再按等号的时候,异常出现了:


关于我上面的异常上面的两行,我是用来标记的,看看传入的queue对象是否正确:
我在第二个类里面,在调用第三个类之前,看看参数queue是什么:

我在第三个类里面,在传入queue参数后,我看看传进来的参数是什么:


这样可以很清楚的看到传进来的参数:
所以我测试了一下第三个类:

用的参数和前面传进来的参数一样:
输出结果完全正确:


我现在自己也搞不懂了,这到底是怎么回事,我上大学一年半了,一直以为学的还可以,
现在第一次做个小项目,已经做了两天了,这是第三天,以为快做完了,现在就这个问题卡在
这里了,哪位好心人帮个忙,谢谢了。。。。
...全文
285 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
bliefroad 2010-01-29
  • 打赏
  • 举报
回复
个人意见,条件较长时,用正则很好很强大
phyerbarte 2010-01-29
  • 打赏
  • 举报
回复
哦。。。我明白为什么了。。。
caofeng891102 2010-01-29
  • 打赏
  • 举报
回复
package caofeng;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Calculator implements ActionListener{
private String str = "";
private JTextArea jtf;
private JFrame frame;
private Container contentPane;
private String []names={"1","2","3","+","退格",
"4","5","6","-","刷新",
"7","8","9","*",".",
"0","(",")","/","="
};
private JButton []buttons=new JButton[20];
public Calculator(){ //构造方法
frame=new JFrame("Calculator"); //定义一个框架
contentPane=frame.getContentPane(); //获取内容格

JPanel jp1=new JPanel(); //定义一个面板
jtf=new JTextArea("",7,43);
jtf.setEditable(false);
jp1.add(jtf);

JPanel jp2=new JPanel();
jp2.setLayout(new GridLayout(4,5,5,5)); //设置布局管理器
this.fillJP2(jp2);

contentPane.add(jp1,BorderLayout.NORTH);
contentPane.add(jp2,BorderLayout.SOUTH);

frame.setSize(500,300);
frame.setVisible(true);
}

private void fillJP2(JPanel j){ //添加组件
for(int i=0;i<names.length;i++){
buttons[i]=new JButton(names[i]);
j.add(buttons[i]);
buttons[i].addActionListener(this);
}
}

private boolean isQiTa(String str) {
if (str.equals("刷新") || str.equals("退格"))
return true;
return false;
}

public void actionPerformed(ActionEvent e){ //事件处理
String strCommand = e.getActionCommand();
if (!isQiTa(strCommand)&&!strCommand.equals("=")) {
str += strCommand;
jtf.setText(str);
}
if (strCommand == "退格") {
if (str == "")
jtf.setText("到头了,你还退什么退啊");
else {
if (str.length() == 1){
str ="";
jtf.setText(str);
}
else {
str = str.substring(0, str.length() - 1);
jtf.setText(str);
}
}
} else if (strCommand == "刷新") {
str="";
jtf.setText(str);
}else if(strCommand.equals("=")){
str+="=";
/////////////////////////////////
float f=new DealwithString().dealwithString(str); //调用
/////////////////////////////////
str+=f;
jtf.setText(str);
}
}

public static void main(String args[]){
new Calculator();
}

}



package caofeng;

import java.util.LinkedList;
import java.util.Queue;

public class DealwithString {
private String num = "";
private String s = "";
private Queue<String> queue = new LinkedList<String>();

private boolean isNum(String str) {
if (str.equals("0") || str.equals("1") || str.equals("2")
|| str.equals("3") || str.equals("4") || str.equals("5")
|| str.equals("6") || str.equals("7") || str.equals("8")
|| str.equals("9") || str.equals("."))
return true;
else
return false;
}

private boolean isFuHao(String str) {
if (str.equals("+") || str.equals("-") || str.equals("*")
|| str.equals("/") || str.equals("(") || str.equals(")"))
return true;
else
return false;
}

public float dealwithString(String str) {
float f = 0;
for (int i = 0; i < str.length(); i++) {
s = str.charAt(i) + "";

if (s.equals("=")) {
if (!num.equals("") ) {
queue.add(num);
queue.add(s);
num = "";
}

else {
queue.add(s);
}
}
if (isNum(s)) {
num += s;
}

else if (isFuHao(s)) {
if (!num .equals("")) {
queue.add(num);
queue.add(s);
num = "";
} else
queue.add(s);
}
}
for(String s:queue)
System.out.print(s+" ");
System.out.println();
////////////调用////////////////////
JiSuan js=new JiSuan();
f=js.evaluateExpression(queue);
///////////////////////////
return f;
}

public static void main(String args[]) {
DealwithString ds = new DealwithString();
//ds.dealwithString("1.2+(12+3)/2=");
}
}


package caofeng;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;


public class JiSuan {

private String precede(String s1,String s2){ //进行优先级判断
String s3="";
char c1=s1.charAt(0);
char c2=s2.charAt(0);
switch(c2){
case '+':
case '-':
if(c1=='('||c1=='=')
s3="<";
else
s3=">";
break;
case '*':
case '/':
if(c1=='*'||c1=='/'||c1==')')
s3=">";
else
s3="<";
break;
case '(':
if(c1==')')
s3="括号不匹配";
else
s3="<";
break;
case ')':
if(c1=='(')
s3="=";
else if(c1=='=')
s3="括号不匹配";
else
s3=">";
break;
case '=':
if(c1=='=')
s3="=";
else if(c1=='(')
s3="括号不匹配";
else
s3=">";
break;
}
return s3;
}

private boolean in(String s){ //判断s是否为六种运算符之一,是返回true,否则返回false
char c=s.charAt(0);
switch(c){
case '+':
case '-':
case '*':
case '/':
case '(':
case '=':
case ')':return true;
default: return false;
}
}

private float operate(float f1,String s,float f2){ //计算操作
char c=s.charAt(0);
switch(c){
case '+':return f1+f2;
case '-':return f1-f2;
case '*':return f1*f2;
default :return f1/f2;
}
}

public float evaluateExpression(Queue<String> queue){ //计算主体

for(String s:queue){
System.out.print(s+" ");
}

Stack<String> stackNUM=new Stack<String>(); //数字栈
Stack<String> stack2EXP=new Stack<String>(); //符号栈

stack2EXP.add("=");
String q=queue.poll(); //从队列头部取一个元素
String s1=stack2EXP.peek();//获取栈顶元素
while(!q.equals("=")||!s1.equals("=")){
if(in(q))
switch(precede(s1,q).charAt(0)){
case '<':stack2EXP.add(q);q=queue.poll();break;
case '=':stack2EXP.pop();q=queue.poll();break;
case '>':String stemp=stack2EXP.pop();float f2=Float.parseFloat(stackNUM.pop());
float f1=Float.parseFloat(stackNUM.pop());stackNUM.add(operate(f1,stemp,f2)+"");
break;
}
else{
stackNUM.add(q);
q=queue.poll();
}
s1=stack2EXP.peek();
}
return Float.parseFloat(stackNUM.pop());
}

public static void main(String args[]){ //测试方法
Queue<String> queue=new LinkedList<String>();
queue.add("1.2");
queue.add("+");
queue.add("(");
queue.add("2");
queue.add("+");
queue.add("3");
queue.add(")");
queue.add("/");
queue.add("2");
queue.add("=");
JiSuan js=new JiSuan();
System.out.println(js.evaluateExpression(queue));
}
}
caofeng891102 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 phyerbarte 的回复:]
问题的确很奇怪。。研究中。
[/Quote]问题已经解决,把代码中的!= 全都改为equals就OK
Dazzlingwinter 2010-01-29
  • 打赏
  • 举报
回复
以前写过,情况要考虑周到
(这个至多算是联系,JavaSE不是Java的强项,也别把这个鞋简历上了哈,O(∩_∩)O~)
phyerbarte 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 caofeng891102 的回复:]
引用 9 楼 huangwj20042008 的回复:
比较字符串的地方有好几处这样比较!=,这样是不对的
字符串必须用equals()比较。


我知道了,问题已经解决,谢谢。。
[/Quote]

解决了?就因为!=的关系?
caofeng891102 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 why675059192 的回复:]
你们什么学校啊  挺牛X啊 ! 大二就学JAVA  !  我们大二那会还学C#呢!  然后大三才学java!
[/Quote]我一个垃圾本二学校,没什么好说的,都靠自己,我大二下学期学C#
caofeng891102 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 huangwj20042008 的回复:]
比较字符串的地方有好几处这样比较!=,这样是不对的
字符串必须用equals()比较。
[/Quote]

我知道了,问题已经解决,谢谢。。
aa651170085 2010-01-29
  • 打赏
  • 举报
回复
厉害啊
why675059192 2010-01-29
  • 打赏
  • 举报
回复
你们什么学校啊 挺牛X啊 ! 大二就学JAVA ! 我们大二那会还学C#呢! 然后大三才学java!
phyerbarte 2010-01-29
  • 打赏
  • 举报
回复
LZ的问题倒不是这类问题,他是相同方法运行出列了不同结果。
huangwj20042008 2010-01-29
  • 打赏
  • 举报
回复
比较字符串的地方有好几处这样比较!=,这样是不对的
字符串必须用equals()比较。
huangwj20042008 2010-01-29
  • 打赏
  • 举报
回复
while(q != null && s1!= null && (q!="="||s1!="=")){
不能这样写,应该这样写:
while(q != null && s1!= null && (!q.equals("=")||!s1.equals("="))){
phyerbarte 2010-01-29
  • 打赏
  • 举报
回复
能否说下大概的代码逻辑?
phyerbarte 2010-01-29
  • 打赏
  • 举报
回复
问题的确很奇怪。。研究中。
caofeng891102 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 laorer 的回复:]
jisuan中的
  String s1=stack2EXP.peek();//获取栈顶元素 下面一行改成

while(q != null && s1!= null && (q!="="||s1!="=")){
[/Quote]
还是不对啊。。。。。测试过了。。。
难道我又得重写代码了
caofeng891102 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 haobaofufob 的回复:]
磨磨唧唧说了一堆,不如贴个异常轨迹来的直接。。。
[/Quote]

异常轨迹怎么搞,我不会,刚学java没多长时间,eclipse搞了也没几个月,好像异常轨迹这词不错。。
laorer 2010-01-29
  • 打赏
  • 举报
回复
主要是你的一些条件没有判断,没考虑过异常情况,或者说没有考虑过 边界条件
laorer 2010-01-29
  • 打赏
  • 举报
回复
jisuan中的
String s1=stack2EXP.peek();//获取栈顶元素 下面一行改成

while(q != null && s1!= null && (q!="="||s1!="=")){
haobaofufob 2010-01-29
  • 打赏
  • 举报
回复
磨磨唧唧说了一堆,不如贴个异常轨迹来的直接。。。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧