0

大家好,我正在尝试创建一个程序以允许用户输入一系列括号(一次一个)并检查是否有相应的结束括号。每次都在新行中输入括号以帮助阅读。我已经为它设置了一个 ADT,但只是想不出如何让 while 循环进行和检查......我知道如果输入了一个(括号我应该把它推入堆栈,当一个(是输入我应该弹出一个堆栈,但我无法计算出中间的位,任何帮助都会受到喜爱:)

//main code   
import java.util.*;

public class SameBrackets
{
   public static void main(String[] args)
   {
      Stack bracket = new Stack();
      Scanner kybd = new Scanner(System.in);

      System.out.print("Enter bracket > ");
      String bracketentered = kybd.next();


          if ("(".equals(bracketentered) )
          {
                 bracket.push(bracketentered);
                 System.out.println(") needed");
          }
          else if (")".equals(bracketentered))
          {
              bracket.pop();
              System.out.println("( needed");
          }


      }
  }

//ADT代码

public class Stack
{
    private String[] a;         //String array
    private int top;

    public Stack()
    {
       a = new String[1];           //create String array
       top = 0;                      
    }

    public boolean isEmpty()
    {
         return top == 0;
    }

    public String pop()          //pop String element
    {
        top--;
        return(a[top]);         //underflow not protected
    }

    public void push(String x)      //push String element
    {
        if (top == a.length)
        {
            resize();
        }
        a[top] = x;
        top++;
    }  

    private void resize()
    {
        String[] temp = new String[a.length * 2];   //resize String array
        for (int i = 0; i < a.length; i++)
        {
            temp[i] = a[i];
         }
        a = temp;
    }
}
4

3 回答 3

1
  • 为什么需要堆栈?你可以有一个计数器,在'('上增加它并在')'上减少它 - 每次减少它时确保它的值仍然是非负的。
  • 不知道你对循环有什么问题。您可以有一个由特定输入终止的 while 循环(例如 - 'q')。

至于你的循环问题:

input = getInput(scanner);
while(input != null) {
  // do what you want with the input

  input = getInput(scanner);
}

private static String getInput(Scanner scanner) {
  get the input from the scanner here - return null if no more input.
}
于 2012-11-26T13:37:50.247 回答
1

您是否正在寻找类似的东西:

if ("(".equals(bracketentered) ) {
    bracket.push(bracketentered);
} else if (")".equals(bracketentered)) {
    bracket.pop();
}
if ( bracket.isEmpty () ) {
    System.out.println("( needed");
} else {
    System.out.println(") needed");
}
于 2012-11-26T15:09:35.817 回答
1

您不需要实现自己的堆栈,一个LinkedList(特别是Deque它实现的接口)已经可以做到这一点。但这是一个很好的锻炼。

您的代码缺少两件事。

  • 一个循环,一直持续到某个终点。不幸的是,当您从控制台输入文本时,结尾System.in并不容易到达。通常是 Ctrl-D 可以结束。添加自己的停止机制是个好主意,否则大多数人不知道如何结束程序。
  • 您需要检查从堆栈中弹出的括号是否与刚刚输入的括号匹配。
  • 您应该检查堆栈最后是否实际上是空的。

如果你这样做,你最终会得到类似的东西

// a stack. You can use your own instead.
Deque<String> stack = new LinkedList<String>();
Scanner kybd = new Scanner(System.in);

String bracketentered;

// 1) repeat while there is more, CTRL-D should end here.
while (kybd.hasNext()) {
    System.out.print("Enter bracket or 'q' to quit:");
    bracketentered = kybd.next();

    if (bracketentered.equals("q")) {
        break; // end this loop
    }

    if ("(".equals(bracketentered)) {
        // just push to stack
        stack.push(bracketentered);
    }
    else if (")".equals(bracketentered)) {
        // in case the stack is empty:
        // stack.pop() throws an exception
        // stack.poll() returns null
        String opposingBracket = stack.poll();

        // there must be a "(" on the stack(
        if (!"(".equals(opposingBracket)) {
            System.out.println("Wrong bracket");
        }
    }
    else {
        // in case it's not ( or )
        System.out.println("Illegal input:" + bracketentered);
    }
}
// 3) loop finished via "q" or end of input - check that stack is empty
if (!stack.isEmpty()) {
    System.out.println("You forgot to close the following brackets:");
    while (!stack.isEmpty()) {
        System.out.print(stack.poll() + " ");
    }
    System.out.println();
}

关于循环中的堆栈与计数括号:一个非常简单的括号计数算法只在最后检查将允许) (,一个在每个步骤中检查的更聪明的算法可能会因多括号组合而失败,例如[ ( ] ). 堆栈确保它们是正确分层的,例如[ () ].

于 2012-11-26T15:14:47.537 回答