中缀转后缀 java_中缀转后缀 java版本实现

1.基于上一播博客https://blog.csdn.net/notears0828/article/details/89047778

2.应用栈,实现将中缀转换成后缀表达是

public class MyExpressionUtil {

/**

* 判断是否是操作符

*/

public static boolean isOperator(char value){

String operatorString = "+-*/()";

return operatorString.indexOf(value) > -1;

}

/**

* 判断操作符的优先级

*/

public static int getPrioraty(char value){

switch (value) {

case '+':

case '-':

return 1;

case '*':

case '/':

return 2;

case '(':

case ')':

return 3;

default:

return 0;

}

}

public static String changeExpression(String express){

char[] expressArr = express.toCharArray();

MyStackstack = new MyStack();

StringBuilder sb = new StringBuilder();

for(int i=0;ichar ch = expressArr[i];

switch (ch) {

case '+':

case '-':

case '*':

case '/':

case '(':

if(stack.isEmpty())

stack.push(ch);

else{

char top = stack.pop();//栈顶元素

if(getPrioraty(top)stack.push(top);

stack.push(ch);

}else if(getPrioraty(top)==getPrioraty(ch)) {

sb.append(top);

stack.push(ch);

}else{

while(getPrioraty(top)>getPrioraty(ch)&&!stack.isEmpty()&&top!='('){

sb.append(top);

top = stack.pop();

}

if(getPrioraty(top)==getPrioraty(ch)){

sb.append(top);

stack.push(ch);

}else{

stack.push(top);

stack.push(ch);

}

}

}

break;

case ')':

char top = stack.pop();//栈顶元素

while(top!='('&&!stack.isEmpty()){

sb.append(top);

top = stack.pop();

}

break ;

default:

sb.append(ch);

break;

}

}

while(!stack.isEmpty()) {

sb.append(stack.pop());

}

return sb.toString();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,中缀表达式(如 `A+B*C-D`)转换后缀表达式(也称为逆波兰表示法,如 `ABC*+D-`)的过程是一个常见的计算机科学问题,通常使用栈数据结构来解决。这里是一个简单的步骤概述: 1. **识别和处理操作符**: - 从左到右遍历中缀表达式的每个字符。 - 如果遇到一个运算符,检查它是否小于或等于栈顶运算符。 - 如果栈顶运算符优先级更高,弹出栈顶元素直到找到一个优先级低于当前运算符的,然后将当前运算符压入栈。 - 否则,直接将当前运算符压入栈。 2. **处理操作数**: - 当遇到操作数时,将其压入栈。 3. **处理括号**: - 如果遇到左括号,将其压入栈。 - 遇到右括号时,根据括号匹配规则,重复上述过程直到遇到左括号。 4. **生成后缀表达式**: - 当遍历完整个表达式后,栈中剩下的就是后缀表达式的元素,从栈顶开始依次读取。 这是一个基础的算法描述,实际的Java代码会更复杂,包括处理特殊字符、错误检查等。以下是一个简单的伪代码示例: ```java Stack<Character> stack = new Stack<>(); String[] operators = {"+", "-", "*", "/"}; // 假设包含这些运算符 for (char c : infixExpression) { if (Character.isDigit(c)) { stack.push(c); } else if (c == '(') { stack.push(c); } else if (c == ')') { while (!stack.isEmpty() && stack.peek() != '(') { pushResult(stack.pop(), stack.pop(), stack.pop()); } stack.pop(); // 弹出左括号 } else { while (!stack.isEmpty() && hasHigherPrecedence(operators, stack.peek(), c)) { pushResult(stack.pop(), stack.pop(), stack.pop()); } stack.push(c); // 将运算符压入栈 } } while (!stack.isEmpty()) { pushResult(stack.pop(), stack.pop(), stack.pop()); } // 函数pushResult用于处理两个操作数和一个运算符生成后缀表达式 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值