使用堆栈java在等式中测试括号

时间:2011-09-14 17:24:10

标签: java

我正在编写一个程序,它将接受一个等式并检查所有括号是否排列,如果它是好的则输出。

对于Ex:(3+4)很好     ((3*8)不好

我不允许使用java内置的push()pop()方法ext .. 我必须自己创造我认为我得到的......我想! 我遇到的问题是在Test()方法中。

首先,我不确定如何编写while循环,如:

while(there are still characters)

无论如何,我得到的输出是:stack is empty -1

感谢任何帮助。我是较慢的项目学习者之一,我不能更努力。感谢。

这是我得到的:

public class Stacked {

  int top;
  char stack[];
  int maxLen;

  public Stacked(int max) {
    top = -1; 
    maxLen = max; 
    stack = new char[maxLen];
  }

  public void push(char item) {
    top++;
    stack[top] = item;
  }

  public int pop() {
    //x = stack[top];
    //top = top - 1;
    top--;
    return stack[top];
  }

  public boolean isStackEmpty() {
    if(top == -1) {
      System.out.println("Stack is empty" + top);
      return true;
    } else 
      return false;
  }

  public void reset() { 
    top = -1;
  }

  public void showStack() {
    System.out.println(" ");
    System.out.println("Stack Contents...");
    for(int j = top; j > -1; j--){
      System.out.println(stack[j]);
    }
    System.out.println(" ");
  }

  public void showStack0toTop() {
    System.out.println(" ");
    System.out.println("Stack Contents...");
    for(int j=0; j>=top; j++){
      System.out.println(stack[j]); 
    }
    System.out.println(" ");
  }
//}

  public boolean test(String p ){
    boolean balanced = false;
    balanced = false;
    //while (  ) 
    for(char i = '('; i < p.length(); i++ ){
      push('(');
    }
    for (char j = ')'; j < p.length(); j++){
      pop();
    }
    if (isStackEmpty()) {
      balanced = true;
      //return balanced;
    }
    return balanced;
  } 

  public static void main(String[] args) {
    Stacked stacks = new Stacked(100);
    String y = new String("(((1+2)*3)");

    stacks.test(y);
    //System.out.println(stacks.test(y));
  }    
}

现在我到了某个地方。我需要再次指出正确的方向。谢谢大家,这帮助了大家。我还有很多事要做,但现在这很好。最终我需要创建另外两个方法:一个“中缀到后缀”,另一个“评估后缀”,最后我需要从文本文件中读取答案,而不是将自己的方法放入主方法中。再次感谢非常感谢。

6 个答案:

答案 0 :(得分:2)

除非您需要实际评估等式,否则堆栈在此处是一个太复杂的解决方案。你只需要一个柜台:

int openParentheses = 0;

for (int i = 0; i < p.length(); i++) {
    if (p.charAt(i) == '(') {
        openParentheses++;
    } else if (p.charAt(i) == ')') {
        openParentheses--;
    }

    //check if there are more closed than open
    if (openParentheses < 0) {
        return false;
    }
}

if (openParentheses == 0) {
    return true;
} else {
    return false;
}

如果你绝对必须使用堆栈,请使用:

for (int i = 0; i < p.length(); i++) {
    if (p.charAt(i) == '(') {
        push('x'); //doesn't matter what character you push on to the stack
    } else if (p.charAt(i) == ')') {
        pop();
    }

    //check if there are more closed than open
    if (stackIsEmpty()) {
        return false;
    }
}

if (isStackEmpty()) {
    return true;
} else {
    return false;
}

答案 1 :(得分:1)

我同意格里夫的意见,除非你没有更多的封闭括号而不是开放,否则你应该包括另一张支票。 (x * y))(不是有效的条目。

int openParentheses = 0;

for (int i = 0; i < p.length(); i++) {
    if (p.charAt(i) == '(') {
        openParentheses++;
    } else if (p.charAt(i) == ')') {
        openParentheses--;
    }
    if(openParentheses<0)
       return false;
}

if (openParentheses == 0) {
    return true;
} else {
    return false;
}

答案 2 :(得分:0)

我认为你只需要这个 -

for ( int i = 0 ; i < p.length(); i++ ) {

    char c = p.charAt(i);
    if ( c == '(' ) 
        push('(');
    else if ( c == ')' ) {
        if ( isStackEmpty() ) {
          // Return error here because of unbalanced close paranthesis
        }
        pop();
    }
    else {
      // do nothing
    }
}

如果必须,您可以使用堆栈,但考虑到这是多么简单,您只需要一个递增和递减的计数器,并在最后检查0。 如果您使用计数器,则应在每次递减后检查该值是否小于0.如果是,则抛出错误。

根据Ryan / Dave Ball的评论编辑

答案 3 :(得分:0)

您可能需要使用堆栈,但这可以通过简单的计数器完成。这将向您展示如何迭代String

的字符
boolean test(String p) {
  int balance = 0;
  for (int idx = 0; idx < p.length(); ++idx) {
    char ch = p.charAt(idx);
    if (ch == '(')
      ++balance;
    else if (ch == ')')
      --balance;
    if (balance < 0)
      return false;
  }
  return balance == 0;
}

当然,您可以分别用堆栈上的推送和弹出替换递增和递减。

答案 4 :(得分:0)

对于解析,您可以在索引上使用for循环,并在特定索引处寻址字符串的字符。

但实际上你不需要堆栈,整数变量openBraces就足够了:

  • 初始化为0
  • for'(''你将变量增加一个
  • for')'你减少变量一
  • 如果openBraces为&lt; 0,则立即给出错误
  • 如果最后openBraces不等于0,则表示您输入错误。

既然你自己应该做作业,我没有发布源代码,只有解释;)

答案 5 :(得分:0)

可以这样做:

String equation = "(2+3))";
        Integer counter = 0;
        //while(equation)
        for(int i=0; i<equation.length();i++)
        {
            if(equation.charAt(i)=='(')
            {
                counter++;
            }
            else
            if(equation.charAt(i)==')')
            {
                counter--;
            }
        }
        if(counter == 0)
        {
            System.out.println("Is good!!!");
        }
        else
        {
            System.out.println("Not good!!!");
        }

    }