使用堆栈检查在java中匹配的括号
嗨,大家伙我想创建一个程序,以允许用户输入一个括号序列(一次一个),并检查是否有一个相应的结束括号。括号每次输入一个新行以帮助阅读。我已经为它设置了ADT,但只是不能想到如何获得while循环和检查......我知道如果(括号被输入,我应该将它推入堆栈,并且当(是进入我应该弹出堆栈之一,但我只是不能工作了位在中间的任何帮助,将喜爱:)使用堆栈检查在java中匹配的括号
//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;
}
}
- 你为什么需要一个堆栈?你可以只有一个计数器,在''上递增'''' - 每次递减时确保它的值仍然是非负数。
- 不知道你对循环的问题是什么。你可以有一个由特定输入终止的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.
}
我被告知使用堆栈,这是抛出我的东西,但我设置它,所以堆栈正在使用一个数组,我可以添加到.....我知道enlish中的方法正在写代码....需要在堆栈中添加一个开放的括号,然后当一个关闭支架被开启时,它将被删除,因为如果在序列结尾处剩下的任何东西被删除,如果你找到我,那么错过了一个。 –
堆栈如果他稍后决定支持不同类型的括号,则会很有用'('和'['。 – ReyCharles
以及那里程序将标题 –
你是否在寻找类似:
if ("(".equals(bracketentered)) {
bracket.push(bracketentered);
} else if (")".equals(bracketentered)) {
bracket.pop();
}
if (bracket.isEmpty()) {
System.out.println("(needed");
} else {
System.out.println(") needed");
}
你不需要实现自己的堆栈,一个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();
}
关于循环叠VS计数括号:只有在最后检查一个非常简单的支架计数算法将允许) (
,在每个步骤中检查的更聪明的人可能会失败,如[ (])
多支架组合。堆栈确保它们是正确分层的,例如, [() ]
。
什么是你使用的民意调查功能 –
@ Jonny_Appleby12我使用了['LinkedList'](http://docs.oracle.com/javase/6/ docs/api/java/util/LinkedList.html#poll%28%29) - 本质上是你的'pop'方法,但有下溢保护 – zapl
正确的原因我现在不能在这个程序中使用linklist,即使我知道你从哪里来:( –
你真的需要堆栈吗?可以创建计数器,而不是堆栈。当你推动括号,然后做我++,当你弹出括号 - 做我 - 。检查弹出如果我 kornero
当您想要评估表达式时,使用堆栈也是有益的,例如使用反向抛光表示法。这就是为什么在历史上以这种方式检查括号的原因 - 否则你只需要一个简单的计数器来完成任务。 – rlegendi