LetCode Basic Calculator(스택으로 표현식 값 계산)
3418 단어 #
사고방식: 창고로 실현
코드는 다음과 같습니다.
public class Solution
{
private int cal(int num1, int num2, char op)
{
switch(op) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
default:
return 0;
}
}
public int calculate(String s)
{
String str = s.trim();
Stack stackInt = new Stack();
Stack stackChar = new Stack();
Map map = new HashMap();
map.put('(', 0); map.put('+', 1); map.put('-', 1); map.put(')', 2);
for (int i = 0; i < str.length(); i++)
{
if (Character.isSpaceChar(str.charAt(i))) {
continue;
}
// ,
if (Character.isDigit(str.charAt(i))) {
int sum = 0;
int j = i;
for (; j < str.length(); j++)
{
if (Character.isDigit(str.charAt(j))) {
sum = sum * 10 + (char)(str.charAt(j) - '0');
} else {
break;
}
}
i = j - 1;
stackInt.add(sum);
} else {
// , ,
if (stackChar.isEmpty()) {
stackChar.add(str.charAt(i));
continue;
}
// ), , (
if (str.charAt(i) == ')') {
while (!stackChar.isEmpty() && stackChar.peek() != '(') {
int num2 = stackInt.pop();
int num1 = stackInt.pop();
char op = stackChar.pop();
int num = cal(num1, num2, op);
stackInt.push(num);
}
if (stackChar.peek() == '(') stackChar.pop();
} else {
// ,
if (str.charAt(i) != '(' && map.get(str.charAt(i)) > map.get(stackChar.peek())) {
stackChar.add(str.charAt(i));
} else {
// ,
while (!stackChar.isEmpty() && str.charAt(i) != '(' && map.get(str.charAt(i)) <= map.get(stackChar.peek())) {
int num2 = stackInt.pop();
int num1 = stackInt.pop();
char op = stackChar.pop();
int num = cal(num1, num2, op);
stackInt.push(num);
}
stackChar.add(str.charAt(i));
}
}
}
}
while (!stackChar.isEmpty()) {
int num2 = stackInt.pop();
int num1 = stackInt.pop();
char op = stackChar.pop();
int num = cal(num1, num2, op);
stackInt.push(num);
}
return stackInt.pop();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Rails Turbolinks를 페이지 단위로 비활성화하는 방법원래 Turobolinks란? Turbolinks는 링크를 생성하는 요소인 a 요소의 클릭을 후크로 하고, 이동한 페이지를 Ajax에서 가져옵니다. 그 후, 취득 페이지의 데이터가 천이 전의 페이지와 동일한 것이 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.