算法训练 二元函数

在这里插入图片描述

import java.util.* ;
public class Main {
//定义两个输入的整数a和b,切记a,b不能放到main函数里面
public static int a ;
public static int b ;
public  static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
//输入两个整数a,b和字符串表达式
a = input.nextInt();
b = input.nextInt();
boolean flag = true ; //标记正负的,初始默认为正
String str = input.next() ;
char [] arr = str.toCharArray() ; //字符串表达式转换成字符数组
Stack <Integer> stack = new Stack<Integer>() ; //创建栈并实例化

for(int i=0; i<arr.length; i++) {
if(arr[i] == '-') { //负号,将flag标记为false
	flag = false ;
}
if(Character.isDigit(arr[i])) { //判断是否是数字
	int number = 0 ;
	for(; i <arr.length && Character.isDigit(arr[i]); i++) {
		//将字符数组转换成字符串类型再转换成整型,如果是连续的数字求出数的大小
		number = number * 10 + Integer.parseInt(String.valueOf(arr[i])) ;
	}
    i -- ; //最后的i会多加了个1,此处应该减去
	if(flag) { //如果是正整数,则直接进栈
		stack.push(number) ;	
		}
	if(!flag) { //如果是负整数,乘-1后进栈,
		stack.push(number * (-1)) ;
		flag = true ;//要把flag还原为true
	}
}
if(arr[i] == ')') { //如果遍历到的字符为')',则说明有括号,栈中最上面的两个元素依次出栈,求出的表达式入栈
	int m = stack.pop();
	int n = stack.pop();
	int result = fun(n,m) ;//先出栈的元素放到后面,因为栈是先进后出的
	stack.push(result) ;
}
}
System.out.println(stack.pop()) ; //打印栈底元素就是最终结果
}
//求解表达式的函数
public static int fun(int x, int y) {
return a * x + b * y ;
}
}

在这里插入图片描述
算法思路:本题考察的就是表达式的进栈和出栈问题,首先要注意的是栈是先进后出的,此题将输入的表达式转换成字符串,然后存入字符数组中,然后对字符数组进行遍历,当遍历到负号,需要把负号后面的数字乘以-1再进栈,要是正整数则直接进栈,当遍历到右括号时,则将元素出栈执行fun函数后的结果再进栈,反复进出栈,直到栈中就剩下最后一个元素,打印栈底元素就是结果了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

nuist__NJUPT

给个鼓励吧,谢谢你

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

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

打赏作者

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

抵扣说明:

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

余额充值