蓝桥杯-表达式计算(java)
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯-表达式计算(java)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
算法訓練 表達式計算 時間限制:1.0s 內存限制:256.0MB問題描述輸入一個只包含加減乖除和括號的合法表達式,求表達式的值。其中除表示整除。輸入格式輸入一行,包含一個表達式。輸出格式輸出這個表達式的值。樣例輸入1-2+3*(4-5)樣例輸出-4數據規模和約定表達式長度不超過100,表達式運算合法且運算過程都在int內進行。
解題思路:這個題目看起來很簡單,但是其實是不簡單的,這個需要運用棧的知識,然后需要把中綴表達式轉后綴表達式來進行計算,如果不太清楚建議看一下棧的知識。
package com.sihai.advance; import java.util.Scanner; import java.util.Stack;public class biaodashi {public static void main(String[] args) {// TODO Auto-generated method stubScanner scanner = new Scanner(System.in);Stack<Integer> nums = new Stack<Integer>(); // 保存數字Stack<Character> opes = new Stack<Character>(); // 保存操作符String string = scanner.nextLine();int n = 0; // 保存每一個數字char[] cs = string.toCharArray();for (int i = 0; i < cs.length; i++) {char temp = cs[i];if (Character.isDigit(cs[i])) {n = 10 * n + Integer.parseInt(String.valueOf(cs[i])); // 大于10的數字保存} else {if (n != 0) {nums.push(n);n = 0;}if (temp == '(') {opes.push(temp);} else if (temp == ')') {while (opes.peek() != '(') { // 括號里面運算完int t = cal(nums.pop(), nums.pop(), opes.pop());nums.push(t);}opes.pop();} else if (isType(temp) > 0) {if (opes.isEmpty()) { // 棧為空直接入棧opes.push(temp);} else {// 若棧頂元素優先級大于或等于要入棧的元素,將棧頂元素彈出并計算,然后入棧if (isType(opes.peek()) >= isType(temp)) {int t = cal(nums.pop(), nums.pop(), opes.pop());nums.push(t);}opes.push(temp);}}}}// 最后一個字符若是數字,未入棧if (n != 0) {nums.push(n);}while (!opes.isEmpty()) {int t = cal(nums.pop(), nums.pop(), opes.pop());nums.push(t);}System.out.println(nums.pop());}// 返回的是運算符的優先級,數字和()不需要考慮public static int isType(char c) {if (c == '+' || c == '-') {return 1;} else if (c == '*' || c == '/') {return 2;} else {return 0;}}// 運算次序是反的,跟入棧出棧次序有關public static int cal(int m, int n, char c) {int sum = -987654321;if (c == '+') {sum = n + m;} else if (c == '-') {sum = n - m;} else if (c == '*') {sum = n * m;} else if (c == '/') {sum = n / m;}return sum;} }總結
以上是生活随笔為你收集整理的蓝桥杯-表达式计算(java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯-递归求二项式系数值(java)
- 下一篇: 蓝桥杯-拿糖果(java)