算法训练 表达式计算 中后缀表达

本文介绍了一种将中缀表达式转换为后缀表达式的方法,并通过一个Java程序实例演示了如何计算后缀表达式的值。文章提供了一个具体的例子,即输入表达式1-2+3*(4-5),并详细展示了其转换过程和计算结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定

  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。


这道题要学习  中缀表达式 --> 后缀表达式 

1-2+3*(4-5);这叫中缀表达式;

1 2 - 3 4 5 - * + ;这叫后缀表达式,是由上面转换而来的;

先看后缀表达式怎们计算出 -4 的;


后缀表达式算起来很神奇 很方便了;把中缀表达式转换成后缀表达式就行了撒;



以下答案并没有处理数字大于9的情况!


import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Stack;


/*1-2+3*(4-5)*/
public class 算法训练表达式计算 {
	static ArrayList<Character> InfixExp = new ArrayList<Character>();//中缀表达式
	static Stack<Character> SuffixStack = new Stack<Character>();//后缀表达式的栈
	static Stack<Character> TempStack = new Stack<Character>();//后缀表达式倒过来的栈
	static Stack<Integer> CalculateStack = new Stack<>();//用于计算后缀表达式的栈;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		String a = null;
		if (input.hasNext()) {
			a = input.nextLine();
		}
		char[] infix = a.toCharArray();
		for (int i = 0; i < a.length(); i++) {
			InfixExp.add(a.charAt(i));
		}
		
		Iterator<Character> iterator = InfixExp.iterator();
//		while (iterator.hasNext()) {
//			Character character = (Character) iterator.next();
//			System.out.print(character+" ");
//		}
		
		TransInfixToSuffix();
		TransSuffixToTemp();
		Calculate();
//		while (!SuffixStack.isEmpty()) {
//			Character temp = SuffixStack.pop();
//			System.out.print(temp+" ");
//		}
//		while (!TempStack.isEmpty()) {
//			Character temp = TempStack.pop();
//			System.out.print(temp+" ");
//		}
		System.out.println(CalculateStack.pop());
	}

	private static void TransSuffixToTemp() {
		// TODO Auto-generated method stub
		while (!SuffixStack.isEmpty()) {
			TempStack.push(SuffixStack.pop());
		}
	}

	private static void Calculate() {
		// TODO Auto-generated method stub
		while (!TempStack.isEmpty()) {
			Character temp = TempStack.pop();
			if (Character.isDigit(temp)) {
				String  a1 =Character.toString(temp);
				int a11 = Integer.valueOf(a1);
				CalculateStack.push(a11);
			}else {
				int a1 = CalculateStack.pop();
				int a2 = CalculateStack.pop();
				if (temp.equals('+')) {
					CalculateStack.push(a2+a1);
				}else if (temp.equals('-')) {
					CalculateStack.push(a2-a1);
				}else if (temp.equals('*')) {
					CalculateStack.push(a2*a1);
				}else {
					CalculateStack.push(a2/a1);
				}
			}
		}
	}

	private static void TransInfixToSuffix() {
		// TODO Auto-generated method stub
		Stack<Character> characters = new Stack<Character>();
		Iterator<Character> iterator = InfixExp.iterator();
		while (iterator.hasNext()) {
			Character character = (Character) iterator.next();
			int i = judge(character);
			switch (i) {
			case 1://数字直接进suffix栈
				SuffixStack.push(character);
				break;
			case 2://(直接进符号栈
				characters.push(character);
				break;
			case 3://碰到右括号
				while (characters.peek()!='(') {
					Character temp = characters.pop();
					SuffixStack.push(temp);
				}
				characters.pop();//把'('弹出去
				break;
			case 4://+和-,不碰到(和栈为空,都要把栈顶的弹出去。因为乘除和加减都满足大于等于这个符号;
				while (!characters.isEmpty()) {
					if (characters.peek()=='+'||characters.peek()=='-'||characters.peek()=='*'||characters.peek()=='/') {
						Character temp = characters.pop();
						SuffixStack.push(temp);
					}
					else {
						break;
					}
				}
				characters.push(character);
				break;
			case 5://乘除号
				while (!characters.isEmpty()) {
					if (characters.peek().equals('+')||characters.peek().equals('-')||characters.peek().equals('(')) {
						break;
					}else if (characters.peek().equals('*')||characters.peek().equals('/')) {
						Character temp = characters.pop();
						SuffixStack.push(temp);
					}
				}
				characters.push(character);
				break;
			default:
				break;
			}
		}
		while (!characters.isEmpty()) {
			Character temp = characters.pop();
			SuffixStack.push(temp);
		}
	}

	private static int judge(Character character) {
		// TODO Auto-generated method stub
		if (Character.isDigit(character)) {
			return 1;//直接入栈
		}else if (character.equals('(')) {
			return 2;//直接入栈
		}else if (character.equals(')')) {
			return 3;
		}else if (character.equals('*')||character.equals('/')) {
			return 5;
		}else {
			return 4;//+和-
		}
		
	}

}

今天好累       明天来改





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

obession

觉得有用可以打赏咖啡一杯~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值