我是一个上了大学一年半的大二学生,所以我想以学生的角度写写一些我感受,希望不要笑话我
以上是我上大学以来第一次写一个像点样子的小项目,一个计算器,可以说一个带括号的计算器,因为不带括号的,复杂度太低,算不上什么项目,只能说一些小操作。
我一直以为加了个括号不会多难,后来设计着设计着,复杂度越来越大下面说说我这三天来写项目过程:
第一:我在想我的计算器项目要哪些功能,我要带括号的,还要带退格功能,刷新功能,小数点等等基本功能,所以我把我的构思画在了纸上,正好20个按钮。再加一个显示屏幕就OK,所以界面我一会就做好了。第二:我要做的是实现功能,我把几个功能细分出来,一个就是退格功能,一个是刷新功能,最难的就是加上括号处理,还有一个是就小数点处理。一共就这四个功能,只要实现了,基本上就没问题了。第三:首先我要整体构思,我要怎么样才能把输入的这么一大串数字加减号小数点什么的处理得比较好呢,所以我想在处理最难的那个问题时我想最好能够送入一个字符串,把字符串作为参数,在送入这个字符串之前,其实要先解决那个退格问题,那个退格问题其实比较简单,按了退格,就把字符串最后一个删除,屏幕刷新一下就行。第四:现在重点来说下处理带括号的表达式问题吧,这个问题其实数据结构里面也有类似的问题,用到栈,符号优先级的判断,分别设两个栈,一个数字栈,一个符号栈。大二上学期我们学过C数据结构,严尉敏的,其实数据结构非常重要,学习数据结构的最高境界就是把里面的抽象算法全都用语言实现出来,大概要至少花半年时间吧,我由于时间问题,和能力问题,实现到了二叉树就叉那了,因为实现太抽像了,呵呵,所以买了本java版的数据结构,继续实现之。用java实现,因为个人比较喜欢java。第五,如果把处理括号这个大功能能解决,那其它的一些小问题都是小菜了。
在实现这个项目时,我犯了一个非常低级的错误,就是    str!=""   str是一个String类型,所以让我苦苦的测试了一天,其它没什么问题,还是CSDN的朋友们帮忙了,谢谢。我把代码贴上来,有兴趣的朋友可以看看,呵呵。。里面难免会有一些小BUGpackage 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));
}
}其实代码不一定重要,最重要的是思想,思想有了,实现只是时间问题。