java蓝桥杯表达式计算_蓝桥杯 ALGO-156 表达式计算 JAVA代码 栈的应用

import java.util.Scanner;

import java.util.Stack;

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

//1-2+3*(4-5)

while(in.hasNext()){

String str = in.next() ;

str="#"+str+"#" ;

//System.out.println(str);

Stack ss = new Stack() ;

Stack op = new Stack() ;

op.clear();

ss.clear();

for(int i=0;i

int pre = 0 ;

if(str.charAt(i)>='0'&&str.charAt(i)<='9'){///读到数字

pre = i ;

for(int j=i;j

if(str.charAt(j)'9'){

i=j ;

break ;

}

if(str.charAt(j)>='0'&&str.charAt(j)<='9'&&j==str.length()-1){

i=str.length() ;

break ;

}

}

//System.out.println(pre+","+i);

int x = Integer.valueOf(str.substring(pre, i)) ;

//System.out.println(x);

i--;

///压入数字栈

ss.push(x) ;

}else{//读到符号

if(str.charAt(i)=='('||(str.charAt(i)=='#'&&op.size()==0)){///左括号和标识直接进入符号栈

op.push(str.charAt(i)) ;

//System.out.println("begin");

continue ;

}

if((op.peek().equals('(')||op.peek().equals('#'))&&(str.charAt(i)=='+'||str.charAt(i)=='-'||str.charAt(i)=='*'||str.charAt(i)=='/')){//第一个运算符压入符号栈

op.push(str.charAt(i)) ;

//System.out.println("first");

continue ;

}

if(str.charAt(i)==')'){///右括号

int temp =0 ;

while(!op.peek().equals('(')){

int b = (int)ss.pop() ;

int a = (int)ss.pop() ;

if(op.peek().equals('+')){

temp = a+b;

}else if(op.peek().equals('-')){

temp = a-b;

}else if(op.peek().equals('*')){

temp = a*b;

}else {

temp = a/b;

}

op.pop();

ss.push(temp) ;

}

op.pop() ;

continue ;

}

if(str.charAt(i)=='#'){///结尾

int temp =0 ;

//System.out.println(op.peek());

while(!op.peek().equals('#')){

int b = (int)ss.pop() ;

int a = (int)ss.pop() ;

if(op.peek().equals('+')){

temp = a+b;

}else if(op.peek().equals('-')){

temp = a-b;

}else if(op.peek().equals('*')){

temp = a*b;

}else{

temp = a/b;

}

op.pop();

ss.push(temp) ;

}

op.pop() ;

continue ;

}

///+-同级之间相遇,前面的算一下就ok了

if((str.charAt(i)=='+'||str.charAt(i)=='-')&&(op.peek().equals('+')||op.peek().equals('-'))){

int temp=0;

int b = (int)ss.pop() ;

int a = (int)ss.pop() ;

if(op.peek().equals('+')){

temp = a+b;

}else{

temp = a-b;

}

//System.out.println("temp="+temp);

op.pop();

ss.push(temp) ;

op.push(str.charAt(i));

continue ;

}

/// */同级之间相遇

if((str.charAt(i)=='*'||str.charAt(i)=='/')&&(op.peek().equals('*')||op.peek().equals('/'))){

int temp=0;

int b = (int)ss.pop() ;

int a = (int)ss.pop() ;

if(op.peek().equals('*')){

temp = a*b;

}else{

temp = a/b;

}

op.pop();

ss.push(temp) ;

op.push(str.charAt(i));

continue ;

}

//+-遇到*/

if((str.charAt(i)=='+'||str.charAt(i)=='-')&&(op.peek().equals('*')||op.peek().equals('/'))){

int temp=0;

int b = (int)ss.pop() ;

int a = (int)ss.pop() ;

if(op.peek().equals('*')){

temp = a*b;

}else{

temp = a/b;

}

op.pop() ;

ss.push(temp) ;

op.push(str.charAt(i));

continue ;

}

///*/遇到+-

if((str.charAt(i)=='*'||str.charAt(i)=='/')&&(op.peek().equals('+')||op.peek().equals('-'))){

op.push(str.charAt(i));

continue ;

}

}

}

System.out.println(ss.peek());

}

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值