展开全部
楼主您好!
友情e68a84e8a2ad3231313335323631343130323136353331333238653862提示:
一.在复制代码前需要自己添加类。
二.调用方法都为静态,请你仔细查看代码并以修改。
三.注意我的包名。
ParseExpression.calculateExp(postExperssion.toString());
请把上句的引用改为你的类名。
代码欣赏:
package com.qs.impStackCode;
public class Stack {
/**
* @param args
*/
private int maxsize;
int[] stackArray;
int top = -1;
public Stack(int s){
maxsize = s;
stackArray = new int[maxsize];
}
protected void push(int value){
if(top >= maxsize)
System.out.println("您存放的存储空间栈已经装满了。");
else
stackArray[++top] = value;
}
protected int pop(){
if(top < 0){
System.out.println("当前的栈无数据,已经空了。");
return -1;
}
return stackArray[top--];
}
public long peek(){
return stackArray[top];
}
protected boolean isEmpty(){
return (top == -1);
}
protected boolean isFull(){
return (top == maxsize - 1);
}
//判断操作符号
public boolean isOperator(int operator){
if(operator == 42 || operator == 43 ||
operator == 45 || operator == 47 ||
operator == 41 || operator == 40)
return true;
else
return false;
}
//设置操作符的优先级
public int priority(int operator){
if(operator == 43 || operator == 45 || operator == 40)
return 1;
else if(operator == 42 || operator == 47)
return 2;
else
return 0;
}
public int result(int operator, int operand1, int operand2){
switch(operator){
case 43:
return (operand2 + operand1);
case 45:
return (operand2 - operand1);
case 42:
return (operand2 * operand1);
case 47:
return (operand2 / operand1);
}
return 0;
}
}
以上是栈类。
以下是逻辑类。
package com.qs.impStackCode;
import java.io.*;
public class ParseExpression {
/**
* @param args
*/
protected static String getStr() throws IOException{
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
return read.readLine();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Stack operator = new Stack(20);
String experssion = null;
//由于我们在数学应中采用都是前序表达所以不得不把它转换成后序或是中序便于处理,
//所以你在代码中看到的postExperssion.append()就是解析好后的后序表达式
StringBuffer postExperssion = new StringBuffer();
int position = 0;
int operator1;
System.out.print("请您输入前序表达试:");
/*
* 读取的是操作数就直接输出。读取的是运算符,该运算符是左括号 ‘(’就把运算符临时存
* 于堆栈中等到循环过程中遇见‘)’就把运算符号从堆栈中取出来。
* 若该运算符不是括号‘()’那么就对操作符“+ - * \/”号进行比较,当前比较的运算符号较低时
* 就停致备用,和下个运算符号进行比较,如果相反则存入堆栈中。直到所有算术式解析完为止
*/
try {
experssion = ParseExpression.getStr();
while(true){
//判断是否是运算符
if(operator.isOperator((int) experssion.charAt(position))){
if(operator.top == -1 || (char) experssion.charAt(position) == '('){
//把运算符存入堆栈中
operator.push(experssion.charAt(position));
}else{
if((char) experssion.charAt(position) == ')'){
//取出运算符直到去出'('
if(operator.stackArray[operator.top] != 40){
operator1 = operator.pop();
postExperssion.append((char)operator1);
}
}else{
if(operator.priority((int) experssion.charAt(position))
<= operator.priority(operator.stackArray[operator.top]) &&
operator.top != -1){
operator1 = operator.pop();
if(operator1 != 40)
postExperssion.append((char)operator1);
}
operator.push(experssion.charAt(position));
}
}
}else
postExperssion.append(experssion.charAt(position));
position++;
if(position >= experssion.length()) break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(operator.top != -1){//取出在堆栈中的所有运算符
operator1 = operator.pop(); postExperssion.append((char)operator1);
} //System.out.println(postExperssion.toString()); ParseExpression.calculateExp(postExperssion.toString());
}
//这个方法属于后续运算方法,就是表达式解析为后序的式子
//如:8/7+(7-2)*4 解析后变成这样 87/72-4*+
/*
* 算法解释:从左至右读取运算单元
* 读取操作数存入堆栈,读取运算符取出操作数进行运算
* 当操作数读完后,即为表达式运算结果
*/
public static void calculateExp(String experssion){
Stack operand = new Stack(20);
int position = 0;
int operand1 = 0;
int operand2 = 0;
int executeResult = 0;
while(true){
if(operand.isOperator(experssion.charAt(position))){
operand1 = operand.pop();
operand2 = operand.pop();
operand.push(operand.result(experssion.charAt(position),
operand1, operand2));
}else
//存入操作数需要做ASCII转换,在这我把其它符号的ASCII
//一并写出来 '[' 91 ']' 93 '{' 123 '}' 125
operand.push(experssion.charAt(position) - 48);
position++;
if(position >= experssion.length())
break;
}
executeResult = operand.pop();
System.out.print("被计算的表示式:" + experssion + " ");
System.out.println("运算结果 = " + executeResult);
}
}
再次感谢楼主加分,如果需要扩展加入‘}’‘]’
这时需要在我的两个类中加入相应条件语句和合理的
if判断OK
本回答由提问者推荐
已赞过
已踩过<
你对这个回答的评价是?
评论
收起