蓝桥杯 算法训练-表达式计算

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

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


----------------------------------------------------------------------------------------------------------------------

解析:


表达式求值其实就是中缀表达式求值,所谓中缀表达式就是指运算符在两个运算对象之间,如4+2。在中缀表达式求值过程中需要两个栈:运算符栈op和运算对象栈num。在op栈中不可能出现')',只可能出现'+','-','*','/','(',设ch为当前读取的字符:

1.ch为'+','-'时,只有当op栈顶为'('或op栈为空时,ch才入栈,否则进行运算直到op栈顶为'(';

2.ch为'*','/'时,只有当op栈顶为'(','+','-'或op栈为空时,ch才入栈,否则op栈顶为'*','/'时运算;

3.ch为运算对象(数字)时,入num栈;

4.ch为'('时,入op栈;

5.ch为')'时,进行循环计算直到op栈顶为'(',并弹出栈顶元素'(';

6.循环判断op栈是否为空,不为空则运算,为空则输出num栈顶元素,即为结果。

ps:其中的运算是从num栈中取两个运算对象,从op栈中取一个运算符进行运算。


Java版代码:

import java.util.Scanner;
import java.util.Stack;

public class Main {
	public static Stack num = new Stack();
	public static Stack op = new Stack();
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		char[] cs = in.nextLine().toCharArray();
		for(int i=0;i




你可能感兴趣的:(算法)