{
//接受一个表达式参数的构造函数
public ExpressionAnalyze(String expr) throws Exception{
this.expr = expr;
numOfParameter = 0;
try{
clearBlank();
seekOutElem();
compute();
}
catch (Exception e){
throw new Exception(e.toString());
}
}
//接受一个表达式参数、一个传值参数的构造函数
public ExpressionAnalyze(String expr,double value1) throws Exception{
this.expr = expr;
numOfParameter = 1;
this.value1 = value1;
try{
clearBlank();
seekOutElem();
compute();
}
catch (Exception e){
throw new Exception(e.toString());
}
}
//接受一个表达式参数、两个传值参数的构造函数
public ExpressionAnalyze(String expr,double value1,double value2)
throws Exception
{
this.expr = expr;
numOfParameter = 2;
this.value1 = value1;
this.value2 = value2;
try{
clearBlank();
seekOutElem();
compute();
}
catch (Exception e){
throw new Exception(e.toString());
}
}
//接受一个表达式参数、三个传值参数的构造函数
public ExpressionAnalyze(String expr,double value1,double value2,double value3)
throws Exception
{
this.expr = expr;
numOfParameter = 3;
this.value1 = value1;
this.value2 = value2;
this.value3 = value3;
try{
clearBlank();
seekOutElem();
compute();
}
catch (Exception e){
throw new Exception(e.toString());
}
}
//清除expr中的空格
private void clearBlank() throws Exception{
//清除expr末尾的空格
expr = expr.trim();
char [] exprArray = new char[expr.length()];
//将expr中的元素复制到数组exprArray中
for(int i = expr.length()-1;i >= 0;i--)
exprArray[i] = expr.charAt(i);
//逐个将空格清除
for(int i = expr.length()-1;i >= 0;i--){
int j;
if(exprArray[i] ==' '){
j = i;
while(j < exprArray.length - 1){
exprArray[j] = exprArray[j + 1];
j++;
}
exprArray[exprArray.length - 1] = ' ';
}
}
//将数组形式转换成StringBuffer形式
StringBuffer exprStrBuf = new StringBuffer("");
for(int i = 0;i < exprArray.length;i++){
exprStrBuf.insert(i,exprArray[i]);
}
//将StringBuffer形式转换成String形式
expr = exprStrBuf.toString().trim();
if(expr.length() == 0)
throw new Exception("\nthe length of the expression is 0");
}
//将字符串中的变量、常量、运算符挑出
private void seekOutElem() throws Exception{
int minLocation;
int startPoint = 0;
boolean isKeyword;
do{
minLocation = expr.length();
isKeyword = false;
for(int i = 0;i < keywords.length;i++) {
int kwdLocation = expr.substring(startPoint).indexOf(keywords[i]);
if(kwdLocation == -1)
kwdLocation = expr.length();
else
kwdLocation += startPoint;
//如果是运算符
if(kwdLocation == startPoint &&
(keywords[i].equals("(") ||
keywords[i].length() == 1 ||
expr.charAt(startPoint + keywords[i].length()) == '('
)
)
{
//如果链表为空
if(elemList == null){
elemList = new ElemList (keywords[i]);
current = elemList;
current.isOperator = true;
}
//如果链表不空
else{
current.next = new ElemList (keywords[i]);
current = current.next;
current.isOperator = true;
}
isKeyword = true;
break;
}
if(minLocation > kwdLocation)
minLocation = kwdLocation;
}
//如果不是运算符
if(!isKeyword){
//如果链表为空
if(elemList == null){
elemList = new ElemList (expr.substring(startPoint,minLocation));
current = elemList;
current.isOperator = false;
}
//如果链表不空
else{
current.next = new ElemList (expr.substring(startPoint,minLocation));
current = current.next;
current.isOperator = false;
}
}
startPoint += current.data.length();
}while(startPoint < expr.length());
//公式末尾添加"#"
current.next = new ElemList ("#");
current = current.next;
current.isOperator = true;
}
//计算最终的结果
private void compute() throws Exception{
//处理公式开头的负号
if(elemList.data.equals("-")){
ElemList temp = new ElemList ("0");
temp.next = elemList;
elemList = temp;
}
for(current = elemList;current.next != null;current = current.next){
//处理负号
if(current.data.equals("(") && current.next.data.equals("-")){
ElemList temp = new ElemList ("0");
temp.next = current.next;
current.next = temp;
}
//处理常量自然对数的底 e
else if(current.data.equals("E"))
current.data = (new Double(Math.E)).toString();
//处理常量圆周率
else if(current.data.equals("PI"))
current.data = (new Double(Math.PI)).toString();
}
//找出公式中的变量,并对其恰当的赋值
boolean findFirst = false , findSecond = false,findThird = false;
switch(numOfParameter){
case 0 :
for(current = elemList;current != null;current = current.next)
if(!current.isOperator){
//强制类型转换,若转换不成功则说明是变量
try{
Double.parseDouble(current.data);
}
catch (NumberFormatException e){
throw new Exception ("\nthe variable '" + current.data
+ "' needs a value");
}
}
break;
case 1 :
for(current = elemList;current != null;current = current.next)
if(!current.isOperator){
//强制类型转换,若转换不成功则说明是变量
try{
Double.parseDouble(current.data);
}
catch (NumberFormatException e){
findFirst = true;
firstStr = new String(current.data);
firstDou = value1;
break;
}
}
if(!findFirst)
throw new Exception ("\nthere is no variable,the value '" + value1
+"' is not needed");
break;
case 2 :
for(current = elemList;current != null;current = current.next)
if(!current.isOperator){
//强制类型转换,若转换不成功则说明是变量
try{
Double.parseDouble(current.data);
}
catch (NumberFormatException e){
findFirst = true;
firstStr = new String(current.data);
firstDou = value1;
break;
}
}
if(!findFirst)
throw new Exception ("\nthere is no variable,the value '" + value1
+"' is not needed");
for(;current != null;current = current.next)
if(!current.isOperator && !current.data.equals(firstStr)){
//强制类型转换,若转换不成功则说明是变量
try{
Double.parseDouble(current.data);
}
catch (NumberFormatException e){
findSecond = true;
secondStr = new String(current.data);
secondDou = value2;
break;
}
}
if(!findSecond)
throw new Exception ("\nthere is not so much variables,the value '"
+ value2 + "' is not needed");
break;
case 3 :
for(current = elemList;current != null;current = current.next)
if(!current.isOperator){
//强制类型转换,若转换不成功则说明是变量
try{
Double.parseDouble(current.data);
}
catch (NumberFormatException e){
findFirst = true;
firstStr = new String(current.data);
firstDou = value1;
break;
}
}
if(!findFirst)
throw new Exception ("\nthere is no variable,the value '" + value1
+"' is not needed");
for(;current != null;current = current.next)
if(!current.isOperator && !current.data.equals(firstStr)){
//强制类型转换,若转换不成功则说明是变量
try{
Double.parseDouble(current.data);
}
catch (NumberFormatException e){
findSecond = true;
secondStr = new String(current.data);
secondDou = value2;
break;
}
}
if(!findSecond)
throw new Exception ("\nthere is not so much variables,the value '"
+ value2 + "' is not needed");
for(;current != null;current = current.next)
if(!current.isOperator && !current.data.equals(firstStr)
&& !current.data.equals(secondStr)){
//强制类型转换,若转换不成功则说明是变量
try{
Double.parseDouble(current.data);
}
catch (NumberFormatException e){
findThird = true;
thirdStr = new String(current.data);
thirdDou = value3;
break;
}
}
if(!findThird)
throw new Exception ("\nthere is not so much variables,the value '"
+ value3 + "' is not needed");
}
//以下是表达式求值的算符优先算法。公式以"#"做结束符。
//设optr和opnd分别为运算符栈和操作数栈
Stack optr = new Stack(); //存储操作符的栈
Stack opnd = new Stack(); //存储操作数的栈
optr.push("#");
current = elemList;
while(!(current.data.equals("#") && optr.top().equals("#"))){
//如果不是运算符,则直接入操作数栈
if(!current.isOperator){
opnd.push(current.data);
current = current.next;
}
else{
int indexOfFirst = 0,indexOfLast = 0;
boolean flagOfFirst = false,flagOfLast = false;
for(int i = 0;i < keywords.length;i++){
if(optr.top().equals(keywords[i])){
indexOfLast = i;
flagOfLast = true;
}
if(current.data.equals(keywords[i])){
indexOfFirst = i;
flagOfFirst = true;
}
if(flagOfLast && flagOfFirst)
break;
}
if(!flagOfLast)
throw new Exception ("\nthe operator '" + optr.top()
+ "' is not supported");
if(!flagOfFirst)
throw new Exception ("\nthe operator '" + current.data
+ "' is not supported");
flagOfLast = false;
flagOfFirst = false;
switch(PRI[indexOfLast][indexOfFirst]){
case '<' ://栈顶元素优先级低
optr.push(current.data);
current = current.next;
break;
case '=' ://脱括弧、计算单目运算并接受下一个字符串
optr.pop();
current = current.next;
boolean isOptr = false;
for(int i = 0;i < keywords.length;i++)
if(optr.top().equals(keywords[i])){
if(keywords[i].length() > 1)
isOptr = true;
break;
}
if(!isOptr)
break;
isOptr = false;
//强制类型转换,若转换不成功则说明是变量
try {
firstDouTemp = Double.parseDouble(opnd.top());
}
catch (NumberFormatException e){
if(opnd.top().equals(firstStr))
firstDouTemp = firstDou;
else if(opnd.top().equals(secondStr))
firstDouTemp = secondDou;
else if(opnd.top().equals(thirdStr))
firstDouTemp = thirdDou;
else
throw new Exception ("\nthe value of '" + opnd.top()
+ "' is not found");
}
opnd.pop();
if(optr.top().equals("abs"))
opnd.push(new Double(Math.abs(firstDouTemp)).toString());
else if(optr.top().equals("acos")){
if(Math.abs(firstDouTemp) > 1)
throw new Exception("\nthe absolute value of the argument '"
+ firstDouTemp + "' that 'acos' takes is greater than 1");
opnd.push(new Double(Math.acos(firstDouTemp)).toString());
}
else if(optr.top().equals("asin")){
if(Math.abs(firstDouTemp) > 1)
throw new Exception("\nthe absolute value of the argument '"
+ firstDouTemp + "' that 'asin' takes is greater than 1");
opnd.push(new Double(Math.asin(firstDouTemp)).toString());
}
else if(optr.top().equals("atan"))
opnd.push(new Double(Math.atan(firstDouTemp)).toString());
else if(optr.top().equals("cbrt"))
opnd.push(new Double(Math.cbrt(firstDouTemp)).toString());
else if(optr.top().equals("cos"))
opnd.push(new Double(Math.cos(firstDouTemp)).toString());
else if(optr.top().equals("cosh"))
opnd.push(new Double(Math.cosh(firstDouTemp)).toString());
else if(optr.top().equals("ceil"))
opnd.push(new Double(Math.ceil(firstDouTemp)).toString());
else if(optr.top().equals("exp"))
opnd.push(new Double(Math.exp(firstDouTemp)).toString());
else if(optr.top().equals("expm1"))
opnd.push(new Double(Math.expm1(firstDouTemp)).toString());
else if(optr.top().equals("floor"))
opnd.push(new Double(Math.floor(firstDouTemp)).toString());
else if(optr.top().equals("log")){
if(firstDouTemp < 0)
throw new Exception("\nthe argument '" + firstDouTemp
+ "' that 'log' takes is less than zero");
opnd.push(new Double(Math.log(firstDouTemp)).toString());
}
else if(optr.top().equals("log10")){
if(firstDouTemp < 0)
throw new Exception("\nthe argument '" + firstDouTemp
+ "' that 'log10' takes is less than zero");
opnd.push(new Double(Math.log10(firstDouTemp)).toString());
}
else if(optr.top().equals("log1p")){
if(firstDouTemp < -1)
throw new Exception("\nthe argument '" + firstDouTemp
+ "' that 'log1p' takes is less than -1");
opnd.push(new Double(Math.log1p(firstDouTemp)).toString());
}
else if(optr.top().equals("rint"))
opnd.push(new Double(Math.rint(firstDouTemp)).toString());
else if(optr.top().equals("round"))
opnd.push(new Double(Math.round(firstDouTemp)).toString());
else if(optr.top().equals("signum"))
opnd.push(new Double(Math.signum(firstDouTemp)).toString());
else if(optr.top().equals("sin"))
opnd.push(new Double(Math.sin(firstDouTemp)).toString());
else if(optr.top().equals("sinh"))
opnd.push(new Double(Math.sinh(firstDouTemp)).toString());
else if(optr.top().equals("sqrt")){
if(firstDouTemp < 0)
throw new Exception("\nthe argument '" + firstDouTemp
+ "' that 'sqrt' takes is less than zero");
opnd.push(new Double(Math.sqrt(firstDouTemp)).toString());
}
else if(optr.top().equals("tan"))
opnd.push(new Double(Math.tan(firstDouTemp)).toString());
else if(optr.top().equals("tanh"))
opnd.push(new Double(Math.tanh(firstDouTemp)).toString());
else if(optr.top().equals("toDegrees"))
opnd.push(new Double(Math.toDegrees(firstDouTemp)).toString());
else if(optr.top().equals("toRadians"))
opnd.push(new Double(Math.toRadians(firstDouTemp)).toString());
else
throw new Exception ("\nthe operator '" + optr.top()
+ "' is not supported");
optr.pop();
break;
case '@' ://表达式输入有误
throw new Exception ("\nthe operators '" + keywords[indexOfLast]
+ "' and '" + keywords[indexOfFirst]
+ "' are not matched");
case '>' ://站定元素优先级高、计算双目运算
//强制类型转换,若转换不成功则说明是变量
try {
secondDouTemp = Double.parseDouble(opnd.top());
}
catch (NumberFormatException e){
if(opnd.top().equals(firstStr))
secondDouTemp = firstDou;
else if(opnd.top().equals(secondStr))
secondDouTemp = secondDou;
else if(opnd.top().equals(thirdStr))
firstDouTemp = thirdDou;
else
throw new Exception ("\nthe value of '" + opnd.top()
+ "' is not found");
}
opnd.pop();
//强制类型转换,若转换不成功则说明是变量
try {
firstDouTemp = Double.parseDouble(opnd.top());
}
catch (NumberFormatException e){
if(opnd.top().equals(firstStr))
firstDouTemp = firstDou;
else if(opnd.top().equals(secondStr))
firstDouTemp = secondDou;
else if(opnd.top().equals(thirdStr))
firstDouTemp = thirdDou;
else
throw new Exception ("\nthe value of '" + opnd.top()
+ "' is not found");
}
opnd.pop();
if(optr.top().equals("+")){
opnd.push(new Double(firstDouTemp + secondDouTemp).toString());
}
else if(optr.top().equals("-")){
opnd.push(new Double(firstDouTemp - secondDouTemp).toString());
}
else if(optr.top().equals("*")){
opnd.push(new Double(firstDouTemp * secondDouTemp).toString());
}
else if(optr.top().equals("/")){
if(secondDouTemp == 0)
throw new Exception ("\nthe second argument that '/' takes is 0");
opnd.push(new Double(firstDouTemp / secondDouTemp).toString());
}
else if(optr.top().equals("%")){
if(secondDouTemp == 0)
throw new Exception ("\nthe second argument that '%' takes is 0");
opnd.push(new Double(firstDouTemp % secondDouTemp).toString());
}
else
throw new Exception ("\nthe operator '" + optr.top()
+ "' is not supported");
optr.pop();
break;
}
}
}
result = Double.parseDouble(opnd.pop());
}
public Double getResult(){
return result;
}
private String firstStr;//存储公式中第一个变量的表达式
private String secondStr;//存储公式中第二个变量的表达式
private String thirdStr;//存储公式中第三个变量的表达式
private double firstDou;//存储公式中第一个变量的值
private double secondDou;//存储公式中第二个变量的值
private double thirdDou;//存储公式中第三个变量的值
private double value1;//从构造函数接收过来的第一个变量得值
private double value2;//从构造函数接收过来的第二个变量得值
private double value3;//从构造函数接收过来的第三个变量得值
private double firstDouTemp;//存储每次计算的第一个临时变量
private double secondDouTemp;//存储每次计算的第二个变量
private ElemList elemList = null;//链表头
private ElemList current = null;//链表当前指针
private int numOfParameter; //公式中变量的个数
private String expr;//存储公式
private double result;//最终的计算结果
//运算符
private static final String [] keywords =
{
"+","-","*","/","(",")","%","abs","acos","asin","atan","cbrt","ceil",
"cos","cosh","exp","expm1","floor","log","log10","log1p","rint","round",
"signum","sin","sinh","sqrt","tan","tanh","toDegrees","toRadians","#"
};
//运算符优先级
private static final char [] [] PRI =
{ // + - * / ( ) % abs acos asin atan cbrt ceil cos cosh exp expm1 floor log log10 log1p rint round signum sin sigh sprt tan tanh toDegrees toRadians #
/**//* + */{'>','>','<','<','<','>','<','<', '<', '<','<', '<', '<', '<','<', '<','<', '<', '<','<', '<', '<', '<', '<', '<','<', '<', '<','<', '<', '<', '>'},
/**//* - */{'>','>','<','<','<','>','<','<', '<', '<','<', '<', '<', '<','<', '<','<', '<', '<','<', '<', '<', '<', '<', '<','<', '<', '<','<', '<', '<', '>'},
/**//* * */{'>','>','>','>','<','>','<','<', '<', '<','<', '<', '<', '<','<', '<','<', '<', '<','<', '<', '<', '<', '<', '<','<', '<', '<','<', '<', '<', '>'},
/**//* / */{'>','>','>','>','<','>','<','<', '<', '<','<', '<', '<', '<','<', '<','<', '<', '<','<', '<', '<', '<', '<', '<','<', '<', '<','<', '<', '<', '>'},
/**//* ( */{'<','<','<','<','<','=','<','<', '<', '<','<', '<', '<', '<','<', '<','<', '<', '<','<', '<', '<', '<', '<', '<','<', '<', '<','<', '<', '<', '@'},
/**//* ) */{'>','>','>','>','@','>','>','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '>'},
/**//* % */{'>','>','>','>','<','>','<','<', '<', '<','<', '<', '<', '<','<', '<','<', '<', '<','<', '<', '<', '<', '<', '<','<', '<', '<','<', '<', '<', '>'},
/**//* abs */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* acos */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* asin */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* cbrt */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* ceil */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* acos */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* cos */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* cos */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* exp */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* expm1*/{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* floor*/{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* log */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* log10*/{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* log1p*/{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* rint*/{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* round*/{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//*signum*/{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* sin */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* sinh */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* sprt*/{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* tan */{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* tanh*/{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//*toDegrees*/{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//*toRadians*/{'@','@','@','@','<','@','@','@', '@', '@','@', '@', '@', '@','@', '@','@', '@', '@','@', '@', '@', '@', '@', '@','@', '@', '@','@', '@', '@', '@'},
/**//* # */{'<','<','<','<','<','@','<','<', '<', '<','<', '<', '<', '<','<', '<','<', '<', '<','<', '<', '<', '<', '<', '<','<', '<', '<','<', '<', '<', '='}
};
public static void main(String [] args){
try{
System.out.println(new ExpressionAnalyze
("-cos(num1 * num2 -num3/num1)+(-E)",12,10,6)
.getResult());
}
catch(Exception e){
System.out.println(e.toString());
}
}
}
//将公式中关键字和其他量分开存放的链式结构
class ElemList {
ElemList (String value) {
data = value;
}
ElemList next;
String data;
boolean isOperator;
}
//Stack类中用到的链式结构
class ListElement {
ListElement (String value){
data = value;
}
ListElement next;
String data;
}
//--栈类
class Stack{
//返回栈顶元素的data域
public String top(){
if(top != null)
return top.data;
else
return null;
}
//将新元素压入栈
public void push(String value){
if(top == null)
top = new ListElement(value);
else{
ListElement temp = new ListElement(value);
temp.next = top;
top = temp;
}
}
//弹出栈顶元素并返回其data域
public String pop(){
String result = top();
if(top != null)
top = top.next;
return result;
}
//判断栈是否为空
public boolean empty(){
return top == null;
}
private ListElement top = null;
}
http://blog.csdn.net/ddpie/archive/2005/03/21/326025.aspx
posted on 2007-12-18 13:33
北国狼人的BloG 阅读(301)
评论(0) 编辑 收藏