栈运算 java_java 用栈实现((a+b)+c)计算

展开全部

楼主您好!

友情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

本回答由提问者推荐

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值