gpt4 book ai didi

java - 后缀堆栈计算器

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:27 26 4
gpt4 key购买 nike

我已经为我的 Java 类创建了一个堆栈计算器来求解诸如

2 + ( 2 * ( 10 – 4 ) / ( ( 4 * 2 / ( 3 + 4) ) + 2 ) – 9 )
2 + { 2 * ( 10 – 4 ) / [ { 4 * 2 / ( 3 + 4) } + 2 ] – 9 }

我们假设在我们的代码中实现 { } [ ]。我只用括号做到了。它仅使用 ( ) 就可以 100% 工作。当我尝试添加 { } [ ] 时,它变得很糟糕。

这是我目前所拥有的:

package stackscalc;

import java.util.Scanner;
import java.util.Stack;
import java.util.EmptyStackException;


class Arithmetic {
int length;
Stack stk;
String exp, postfix;

Arithmetic(String s) {
stk = new Stack();
exp = s;
postfix = "";
length = exp.length();

}
boolean isBalance() {
boolean fail = false;
int index = 0;

try {
while (index < length) {
char ch = exp.charAt(index);

switch(ch) {
case ')':
stk.pop();
break;

case '(':
stk.push(new Character(ch));
break;

default:
break;
}
index++;
}
} catch (EmptyStackException e) {
fail = true;
}
return stk.empty() && !fail;
}
void postfixExpression() {
String token = "";
Scanner scan = new Scanner(exp);
stk.clear();

while(scan.hasNext()) {
token = scan.next();
char current = token.charAt(0);

if (isNumber(token)) {
postfix = postfix + token + " ";
} else if(isParentheses(current)) {
if (current == '(') {
stk.push(current);
} else {
Character ch = (Character) stk.peek();
char nextToken = ch.charValue();

while(nextToken != '(') {
postfix = postfix + stk.pop() + " ";

ch = (Character) stk.peek();

nextToken = ch.charValue();
}
stk.pop();
}
} else {
if (stk.empty()) {
stk.push(current);
} else {
Character ch = (Character) stk.peek();
char top = ch.charValue();

if (hasHigherPrecedence(top, current)) {
stk.push(current);
} else {
ch = (Character) stk.pop();

top = ch.charValue();

stk.push(current);

stk.push(top);
}
}
}
}
try {
Character ch = (Character) stk.peek();
char nextToken = ch.charValue();

while (isOperator(nextToken)) {
postfix = postfix + stk.pop() + " ";
ch = (Character) stk.peek();
nextToken = ch.charValue();
}
} catch (EmptyStackException e) {}
}
boolean isNumber(String s) {
try {
int Num = Integer.parseInt(s);
} catch(NumberFormatException e) {
return false;
}
return true;
}
void evaluateRPN() {
Scanner scan = new Scanner(postfix);
String token = "";
stk.clear();

while(scan.hasNext()) {
try {
token = scan.next();
if (isNumber(token)) {
stk.push(token);
} else {
char current = token.charAt(0);
double t1 = Double.parseDouble(stk.pop().toString());
double t2 = Double.parseDouble(stk.pop().toString());
double t3 = 0;

switch (current) {
case '+': {
t3 = t2 + t1;
stk.push(t3);
break;
}
case '-': {
t3 = t2 - t1;
stk.push(t3);
break;
}
case '*': {
t3 = t2 * t1;
stk.push(t3);
break;
}
case '/': {
t3 = t2 / t1;
stk.push(t3);
break;
}
default: {
System.out.println("Reverse Polish Notation was unable to be preformed.");
}
}
}

} catch (EmptyStackException e) {}
}
}
String getResult() {
return stk.toString();
}

int stackSize() {
return stk.size();
}

boolean isParentheses(char current) {
if ((current == '(') || (current == ')')) {
return true;
} else {
return false;
}
}

boolean isOperator(char ch) {
if ((ch == '-')) {
return true;
} else if ((ch == '+')) {
return true;
}
else if ((ch == '*')) {
return true;
}
else if((ch == '/')) {
return true;
} else {

}
return false;
}

boolean hasHigherPrecedence(char top, char current) {
boolean HigherPre = false;

switch (current) {
case '*':
HigherPre = true;
break;

case '/':
HigherPre = true;
break;

case '+':

if ((top == '*') || (top == '/') || (top == '-')) {
HigherPre = false;
} else {
HigherPre = true;
}

break;

case '-':
if ((top == '*') || (top == '/') || (top == '-')) {
HigherPre = false;
} else {
HigherPre = true;
}
break;

default:
System.out.println("Higher Precedence Unsuccessful was unable to be preformed.");
break;
}

return HigherPre;


}

String getPostfix() {
return postfix;
}
}

最佳答案

我假设 ()、{} 和 [] 在操作顺序方面都具有相同的权重,您只需要修改您的代码以允许所有这三者互换。

如果是这种情况,我将只使用带有简单正则表达式检查的匹配器类来查看您正在查看的当前字符是括号、大括号还是方括号。

    //convert char to string
String temp += currentChar;
//this will check for (, [, and { (need escapes because of how regex works in java)
Pattern bracePattern = Pattern.compile("[\(\{\[]");
Matcher matcher = numPatt.matcher(temp);
if(matcher.find()){
//you know you have a grouping character
}

此代码应允许您找到所有开始的分组字符(只需在正则表达式中替换 (、{ 和 [ )、} 和 ] 来查找结束字符)。这可以在您的 isParenthesis() 方法中使用。

关于java - 后缀堆栈计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11190264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com