蓝桥杯--表达式计算

‘自制模拟栈’-中缀表达式直接运算

因为没有使用java中的栈来做这个题。代码有一些繁琐。


//中缀表达式直接求值
import java.util.*;


public class Main {

public static int b1=0;//记录b数组长度
public static int c1=0;//记录c数组长度


public static void js(char x1[],int b2[],char c){

int i= b1-1,j=c1-1;


for(;i>=0 && j>=0;i--,j--)
{
if(x1[i] == '*')
{
b2[j-1]=b2[j-1]*b2[j];
b2[j]=0;
c1--;
}
else if(x1[i]== '/')
{
b2[j-1]=b2[j-1]/b2[j];
b2[j]=0;
c1--;
}
else if(x1[i] =='-')
{
b2[j-1]=b2[j-1]-b2[j];
b2[j]=0;
c1--;
}
else if(x1[i]=='+')
{
b2[j-1]=b2[j-1]+b2[j];
b2[j]=0;
c1--;
}
else
{
x1[i+1]=c;
b1=i+1;
break;
}
}
if(i == -1)
{
x1[i+1]=c;
b1=i+2;
}
else
{
b1++;
}
// System.out.println(b[c1]);
return ;
}
//计算

public static void jg(char x[],int b3[],char c){

int i= b1-1,j=c1-1;

for(;i>=0 && j>0;i--,j--)
{
if(x[i] == '*')
{
b3[j-1]=b3[j-1]*b3[j];
b3[j]=0;
c1--;
}
else if(x[i]== '/')
{
b3[j-1]=b3[j-1]/b3[j];
b3[j]=0;
c1--;
}
else if(x[i] =='-')
{
b3[j-1]=b3[j-1]-b3[j];
b3[j]=0;
c1--;
}
else if(x[i]=='+')
{
b3[j-1]=b3[j-1]+b3[j];
b3[j]=0;
// System.out.println(b[j-1]);
c1--;
}
else
{
break;
}
}
// x[b1-1]='\0';
b1=i;
}
//‘)’计算

public static void main(String [] args){
Scanner sr=new Scanner(System.in);
String str=new String();
str=sr.next();
char a[]=str.toCharArray();//存放本身表达式
int l=a.length;
char b[]=new char[l+1];//存放字符
// int b1=0;//记录b数组长度
int c[]=new int[l+1];//存放数字
// int c1=0;//记录c数组长度
// System.out.println(l);
c[0]=0;
for(int i=0;i<l;i++)
{
if(a[i]>=48 && a[i]<=57)
{
c[c1]= c[c1]*10+a[i]-48;
if(i != l-1)
{
int j=i+1;
while( a[j]>=48 && a[j]<=57)
{
c[c1]= c[c1]*10+a[j]-48;
j++;
if(j==l)
{
j=j-1;
break;
}
}
i=j;
}
// System.out.println(c[c1]);
c1++;
}
if(a[i] =='*' || a[i]=='/' || a[i]=='(')
{
b[b1]=a[i];
// System.out.println(b[b1]);
b1++;
}
if(a[i]=='+' || a[i]=='-')
{
if(b1==0 || b[b1-1]== '(')
{
b[b1]=a[i];
// System.out.println(b[b1]);
b1++;
}
else 
{
js(b,c,a[i]);
// System.out.println(b[b1]);
}
}
if(a[i]==')')
{
jg(b,c,a[i]);
}
}
js(b,c,'0');
System.out.println(c[0]);
}
}


欢迎交流。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值