224 227 772 Basic Calculator I, II, III
class Solution {
public int calculate(String s) {
// two stack operator stack and operand stack
// build two stack;
Deque ops = new ArrayDeque<>();
Deque nums = new ArrayDeque<>();
//while loop
int pt = 0;
while (pt < s.length()) {
if (s.charAt(pt) == ' ') {
pt++;
} else if ("+-)".indexOf(s.charAt(pt)) >= 0) {
popStack(ops, nums);
if (s.charAt(pt) == ')') {
ops.pop();
pt++;
} else {
ops.push(s.charAt(pt++)); // + -
}
} else if (s.charAt(pt) == '(') {
ops.push(s.charAt(pt++));
} else { // number
int num = 0;
while (pt < s.length() && Character.isDigit(s.charAt(pt))) {
num *= 10;
num += s.charAt(pt++) - '0';
}
nums.push(num);
}
}
popStack(ops, nums);
return nums.pop();
}
private void popStack(Deque ops, Deque nums) {
while (!ops.isEmpty() && ops.peek() != '(') {
int num2 = nums.pop();
int num1 = nums.pop();
char op = ops.pop();
nums.push(num1 + (op == '+' ? 1 : -1) * num2);
}
}
}
227II 코드는 괄호가 없어서 Stack을 사용하지 않았습니다.sum,last,op만 사용했습니다.sum는 청산된 수를 저장하는 데 사용됩니다.last는 진행 중인 수를 저장하는 데 사용됩니다.예를 들어 현재 진행 중인 곱셈 초기화last는 1,op는 *.sum은 0
class Solution {
public int calculate(String s) {
int sum = 0, last = 1;
char op = '*';
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') continue;
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
sum += last;
last = s.charAt(i) == '+' ? 1 : -1;
op = '*';
} else if (s.charAt(i) == '*' || s.charAt(i) == '/') {
op = s.charAt(i);
} else {
int num = 0;
while (i < s.length() && Character.isDigit(s.charAt(i))) {
num *= 10;
num += s.charAt(i++) - '0';
}
i--;
if (op == '*') last *= num;
else last /= num;
}
}
return sum + last;
}
}
III 코드에도 버그가 하나 나왔는데, 바로 좌우 괄호의 우선순위입니다.오른쪽 괄호가 왼쪽 괄호를 만났을 때, 정지하십시오.
class Solution {
public int calculate(String s) {
Deque nums = new LinkedList<>();
Deque ops = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
// space do nothing
if (s.charAt(i) == ' ') {
continue;
} else if ("+-)".indexOf(s.charAt(i)) >= 0) {
popStack(nums, ops, s.charAt(i));
if (s.charAt(i) == ')') {
ops.pop();
} else {
ops.push(s.charAt(i));
}
// + - ) pop till ( or empty
} else if ("*/".indexOf(s.charAt(i)) >= 0) {
// * / pop till + - or (
popStack(nums, ops, s.charAt(i));
ops.push(s.charAt(i));
} else if (s.charAt(i) == '(') {
// ( put in
ops.push('(');
} else {
//number //remember i -- or
int num = s.charAt(i) - '0';
while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))) {
num *= 10;
num += s.charAt(++i) - '0';
}
nums.push(num);
}
}
popStack(nums,ops, '+');
return nums.pop();
}
private void popStack(Deque nums, Deque ops, char lastOp) {
while(!ops.isEmpty() && getPriority(ops.peek()) >= getPriority(lastOp)) {
int num2 = nums.pop();
int num1 = nums.pop();
nums.push(calc(num1, num2, ops.pop()));
}
}
private int getPriority(char c) {
if ("*/".indexOf(c) >= 0) return 3;
if ("+-".indexOf(c) >= 0) return 2;
if (")".indexOf(c) >= 0) return 1; //
// 。
return 0;
}
private int calc(int a, int b, char c) {
if (c == '+') return a + b;
if (c == '-') return a - b;
if (c == '*') return a * b;
if (c == '/') return a / b;
return 0;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.