バイナリ機能アルゴリズムのトレーニング

ここに画像を挿入説明

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が乗算され、もし、正の整数の後に直接スタックにされています結果はスタックに、スタックと述べ、スタックまで、最後の要素を残して、印刷スタック底部要素は結果です!

公開された43元の記事 ウォン称賛26 ビュー8812

おすすめ

転載: blog.csdn.net/nuist_NJUPT/article/details/105011645