Java 如何确定表达式在堆栈中是否有平衡括号?
所以我写了这段代码来确定一个表达式在堆栈中是否有平衡括号:Java 如何确定表达式在堆栈中是否有平衡括号?,java,methods,stack,Java,Methods,Stack,所以我写了这段代码来确定一个表达式在堆栈中是否有平衡括号: public static boolean isBalanced(String expr) { StringStack stack = new StringStackRefBased(); try{ for (int i = 0; i<expr.length(); i++){ if (expr.charAt(i) == ('(')){ stack.push("(");
public static boolean isBalanced(String expr) {
StringStack stack = new StringStackRefBased();
try{
for (int i = 0; i<expr.length(); i++){
if (expr.charAt(i) == ('(')){
stack.push("(");
} else if (expr.charAt(i) == (')')){
stack.pop();
}
}
if (stack.isEmpty()){
return true;
} else {
return false;
}
} catch (StringStackException e) {
return false;
}
}
方法很好。如果我使用Java自己的堆栈:
class Main {
public static boolean isBalanced(String expr) {
Stack<String> stack = new Stack<>();
try{
for (int i = 0; i<expr.length(); i++){
if (expr.charAt(i) == ('(')){
stack.push("(");
} else if (expr.charAt(i) == (')')){
stack.pop();
}
}
if (stack.isEmpty()){
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
}
public static void main(String[] args) {
System.out.println(isBalanced("("));
System.out.println(isBalanced("(()"));
System.out.println(isBalanced("())"));
System.out.println(isBalanced("((()))"));
System.out.println(isBalanced("(()())"));
}
}
方法很好。如果我使用Java自己的堆栈:
class Main {
public static boolean isBalanced(String expr) {
Stack<String> stack = new Stack<>();
try{
for (int i = 0; i<expr.length(); i++){
if (expr.charAt(i) == ('(')){
stack.push("(");
} else if (expr.charAt(i) == (')')){
stack.pop();
}
}
if (stack.isEmpty()){
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
}
public static void main(String[] args) {
System.out.println(isBalanced("("));
System.out.println(isBalanced("(()"));
System.out.println(isBalanced("())"));
System.out.println(isBalanced("((()))"));
System.out.println(isBalanced("(()())"));
}
}
方法很好。如果我使用Java自己的堆栈:
class Main {
public static boolean isBalanced(String expr) {
Stack<String> stack = new Stack<>();
try{
for (int i = 0; i<expr.length(); i++){
if (expr.charAt(i) == ('(')){
stack.push("(");
} else if (expr.charAt(i) == (')')){
stack.pop();
}
}
if (stack.isEmpty()){
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
}
public static void main(String[] args) {
System.out.println(isBalanced("("));
System.out.println(isBalanced("(()"));
System.out.println(isBalanced("())"));
System.out.println(isBalanced("((()))"));
System.out.println(isBalanced("(()())"));
}
}
方法很好。如果我使用Java自己的堆栈:
class Main {
public static boolean isBalanced(String expr) {
Stack<String> stack = new Stack<>();
try{
for (int i = 0; i<expr.length(); i++){
if (expr.charAt(i) == ('(')){
stack.push("(");
} else if (expr.charAt(i) == (')')){
stack.pop();
}
}
if (stack.isEmpty()){
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
}
public static void main(String[] args) {
System.out.println(isBalanced("("));
System.out.println(isBalanced("(()"));
System.out.println(isBalanced("())"));
System.out.println(isBalanced("((()))"));
System.out.println(isBalanced("(()())"));
}
}
StringStack没有太多内容,但是StringStackRefBased包含了所有方法。我已更新代码以显示基于StringStackRef的。我想知道的最大的事情是,push和pop方法正确吗?为什么不只使用int并执行
count++
和count--
?最后,您可以检查计数是否为零。问题在于您的StringStack
,因为如果我用Java的内置堆栈替换它,它就可以正常工作。请验证push方法。我认为问题就在这里。isEmpty()
的实现与push()
和pop()
的实现不兼容。调用push()
后,无论您调用pop
多少次,head都不会为null
。StringStack中没有太多内容,但StringStackRefBased中包含所有方法。我已更新代码以显示基于StringStackRef的。我想知道的最大的事情是,push和pop方法正确吗?为什么不只使用int并执行count++
和count--
?最后,您可以检查计数是否为零。问题在于您的StringStack
,因为如果我用Java的内置堆栈替换它,它就可以正常工作。请验证push方法。我认为问题就在这里。isEmpty()
的实现与push()
和pop()
的实现不兼容。调用push()
后,无论您调用pop
多少次,head都不会为null
。StringStack中没有太多内容,但StringStackRefBased中包含所有方法。我已更新代码以显示基于StringStackRef的。我想知道的最大的事情是,push和pop方法正确吗?为什么不只使用int并执行count++
和count--
?最后,您可以检查计数是否为零。问题在于您的StringStack
,因为如果我用Java的内置堆栈替换它,它就可以正常工作。请验证push方法。我认为问题就在这里。isEmpty()
的实现与push()
和pop()
的实现不兼容。调用push()
后,无论您调用pop
多少次,head都不会为null
。StringStack中没有太多内容,但StringStackRefBased中包含所有方法。我已更新代码以显示基于StringStackRef的。我想知道的最大的事情是,push和pop方法正确吗?为什么不只使用int并执行count++
和count--
?最后,您可以检查计数是否为零。问题在于您的StringStack
,因为如果我用Java的内置堆栈替换它,它就可以正常工作。请验证push方法。我认为问题就在这里。isEmpty()
的实现与push()
和pop()
的实现不兼容。调用push()
后,head永远不会null
无论您调用pop
@GriffeyDog多少次,问题在于他的方法(其背后的逻辑),这很好。我只是让他看了看他的书堆。如果他愿意为他的堆栈提供(完整的)源代码,我很乐意在我的答案中提供信息。是的,我知道。再说一次,如果他能提供该类的完整来源,我非常乐意用额外的信息编辑我的答案(如果有人在我之前没有这样做的话)。首先,问题是我的push和pop方法不能正确工作,我不确定如何修复它们。对于push,我试图将旧头设置为前一个节点,并继续增加堆栈的大小。@GriffeyDog,问题是关于他的方法(其背后的逻辑),这很好。我只是让他看了看他的书堆。如果他愿意为他的堆栈提供(完整的)源代码,我很乐意在我的答案中提供信息。是的,我知道。再说一次,如果他能提供该类的完整来源,我非常乐意用额外的信息编辑我的答案(如果有人在我之前没有这样做的话)。首先,问题是我的push和pop方法不能正确工作,我不确定如何修复它们。对于push,我试图将旧头设置为前一个节点,并继续增加堆栈的大小。@GriffeyDog,问题是关于他的方法(其背后的逻辑),这很好。我只是让他看了看他的书堆。如果他愿意为他的堆栈提供(完整的)源代码,我很乐意在我的答案中提供信息。是的,我知道。再说一次,如果他能提供该类的完整来源,我非常乐意用额外的信息编辑我的答案(如果有人在我之前没有这样做的话)。首先,问题是我的push和pop方法不能正确工作,我不确定如何修复它们。对于push,我试图将旧头设置为前一个节点,并继续增加堆栈的大小。@GriffeyDog,问题是关于他的方法(其背后的逻辑),这很好。我只是让他看了看他的书堆。如果他愿意为他的堆栈提供(完整的)源代码,我很乐意在我的答案中提供信息。是的,我知道。再说一次,如果他能提供该类的完整来源,我非常乐意用额外的信息编辑我的答案(如果有人在我之前没有这样做的话)。首先,问题是我的push和pop方法不能正确工作,我不确定如何修复它们。为了推动我,我正试着改变过去的想法
class StringStack {
private StringNode head = null;
public boolean isEmpty(){
return head == null;
}
public void push(String item) {
StringNode oldHead = head;
head = new StringNode(item);
head.next = oldHead;
}
public String pop() throws StringStackException {
if (isEmpty()) {
throw new StringStackException("Empty Stack");
}
String result = head.item;
head = head.next;
return result;
}
public String peek() throws StringStackException {
if (isEmpty()) {
throw new StringStackException("Stack underflow");
}
return head.item;
}
static class StringNode {
String item;
StringNode next;
public StringNode(String item) {
this.item = item;
}
}
}