算法训练 表达式计算
时间限制:1.0s 内存限制:256.0MB
问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
思路:
先要学会将中缀表达式转换为后缀表达式:中缀表达式转换为后缀表达式。在符号栈底加一个 '(' 防止栈为空,在字符串中加一个 "." ,将栈的运算符全部提取出来。
检测到")" 不入栈, 而是将符号栈中的"(" 之上的运算符提出来,供给栈顶次顶元素运算,并将栈顶和次顶两个元素删除得到的新的值存入数值栈。碰到“.”,就按碰到+-运算符的处理方案一样。最后数值栈的那个值(既是栈顶也是栈底)即为运算结果
参考博客:https://blog.csdn.net/qq_36238595/article/details/54730341#commentsedit
此题与HDU - 1237 简单计算器 相同
import java.util.*;
public class Main {
static Stack<Character> ch = new Stack<Character>(); //符号栈
static Stack<Integer> num = new Stack<Integer>(); //数值栈
static char[] a = new char[110];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
ch.push('('); //栈底
String s = cin.next();
s = s+".";
int k = 0;
for(int i=0;i<s.length();i++)
{
if(s.charAt(i)>='0' && s.charAt(i)<='9')
{
a[k++] = s.charAt(i);
continue;
}
a[k] = '\0'; // 结尾
if(a[0]!='\0')
{
String str = new String(a, 0, k); //将字符转换为字符串
int w = Integer.parseInt(str); //将字符串转换为数字
a[0] = '\0';
num.push(w);
}
k = 0;
switch(s.charAt(i))
{
case '+':
zhan1();
ch.push('+');
break;
case '-':
zhan1();
ch.push('-');
break;
case '*':
zhan2();
ch.push('*');
break;
case '/':
zhan2();
ch.push('/');
break;
case '(':
ch.push('(');
break;
case ')':
zhan1();
ch.pop();
break;
case '.':
zhan1();
ch.pop();
break;
}
}
System.out.println(num.peek());
}
public static void zhan1() //这个函数只接收+-号,+-号等级最低,运算符栈中除了括号外 都可以取出运算
{
int x,y;
int m = 0;
while(ch.peek()!='(') //从运算符栈中取一个运算符 对数值栈顶和次顶元素进行运算
{
x = num.peek();
num.pop();
y = num.peek();
num.pop();
switch(ch.peek())
{
case '+':
m = y+x;
break;
case '-':
m = y-x;
break;
case '*':
m = y*x;
break;
case '/':
m = y/x;
break;
}
ch.pop();
num.push(m);
}
}
public static void zhan2() //只接受 * / , */的优先级比+-的高,所以不能将+-取出
{
int x,y;
int m = 0;
while(ch.peek()=='*' || ch.peek()=='/') //从运算符栈中取一个运算符 对数值栈顶和次顶元素进行运算
{
x = num.peek();
num.pop();
y = num.peek();
num.pop();
switch(ch.peek())
{
case '*':
m = y*x;
break;
case '/':
m = y/x;
break;
}
ch.pop();
num.push(m);
}
}
}