【发布时间】:2015-09-10 19:43:00
【问题描述】:
我正在通过编写一个验证括号语法的程序来学习堆栈。如果我输入(Baller) 它应该会给我一个积极的结果。如果我有(Baller(),它应该会给我一个否定的结果。本质上,应用程序检查用户是否正确使用了 ()、{} 和 []。
- 如果遇到 ( 、 { 或 [ 字符,我会将其添加到 堆栈上的字符。
- 如果我遇到 ) } ] 符号,我将从堆栈中删除一个字符。
- 如果文本包含奇数个圆括号或方括号
连续(例如, ( 和 ] 不连续),错误
消息被打印出来。
所以我在 if else 语句中完成了这一半,但我认为在 switch 语句中应该更容易,并且也是一个很好的学习体验。
所以我在switch语句中所做的是这样的:
public class Input {
public static void main(String[] args) {
Stack stack = new Stack();
String str;
str = JOptionPane.showInputDialog("Text to parse: ");
char arr[] = str.toCharArray();
System.out.print(str);
System.out.println();
System.out.println();
for(char c : arr) {
switch(c) {
case '{':
stack.Push(c);
System.out.print(stack.firstNode.getData());
break;
case '(':
stack.Push(c);
System.out.print(stack.firstNode.getData());
break;
case '[':
stack.Push(c);
System.out.print(stack.firstNode.getData());
break;
case '}':
c = (Character) stack.Peek(); //<-- Edited for @Jimmy
if( c != '{') {
System.out.println(" Syntax ERROR");
}
case ']':
if( c != '[') {
System.out.println(" Syntax ERROR");
}
case ')':
if( c != '(') {
System.out.println(" Syntax ERROR");
}
}
}
}
}
但是现在我遇到了一个问题,如果我只添加一个右侧括号,它就会被删除,因为我有一个弹出窗口。我试图在 if-else 语句中做到这一点,该语句将以这样的 if 语句结束:
if(first == '(' && (current == '}' || current == ']')) {
if first == '{' && (current == ']' || current == ')')) {
//and so on
我怎样才能把它变成一个开关盒?这是一个坏主意吗?
我所知道的是,我的左侧支架并没有真正的问题,但右侧支架确实存在问题。
编辑:代码现在看起来如何
import javax.swing.JOptionPane;
public class Input {
public static void main(String[] args) {
Stack stack = new Stack();
String str;
str = JOptionPane.showInputDialog("Text to parse: ");
char arr[] = str.toCharArray();
System.out.print(str);
System.out.println();
System.out.println();
for(char c : arr) {
switch(c) {
case '{':
stack.Push(c);
break;
case '(':
stack.Push(c);
break;
case '[':
stack.Push(c);
break;
case '}':
if(stack.isEmpty() || (Character) stack.Pop() != '{') {
System.out.println(" Syntax ERROR");
}
break;
case ']':
if(stack.isEmpty() || (Character) stack.Pop() != '[') {
System.out.println(" Syntax ERROR");
}
break;
case ')':
if(stack.isEmpty() || (Character) stack.Pop() != '(') {
System.out.println(" Syntax ERROR");
}
break;
}
} if(!stack.isEmpty()) {
System.out.println(" Syntax ERROR");
}
}
}
【问题讨论】:
-
您可以使用 peek(),它只会让您看到堆栈的最后内容。如果没有错误,则可以调用 pop() 否则不要调用 pop 并且不会被删除。
-
@Jimmy 你能举例说明它在代码中的工作方式吗?否则你打算在哪里改变?
-
在您的第一个删除案例中类似这样的事情。即案例'}':
c = (Character) stack.Peek(); if( c != '{') { System.out.println(" Syntax ERROR"); }else stack.Pop(); -
@Jimmy Ok 所以我将其更改为 Peek() 并得到相同的结果。我在编辑中进行了更改,以向您显示编辑的位置。
-
我认为最干净的解决方案是避免失败并在每个
case中单独弹出。但请注意空堆栈的情况。此外,您应该使用Stack<Character>来摆脱不安全的演员表。
标签: java if-statement stack switch-statement