我正在通过编写一个验证括号语法的程序来学习堆栈。如果我输入
(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");
}
}
}
}
}
但是我现在遇到的问题是,如果我只添加一个右括号,它就会被删除,因为我有一个 pop。我尝试用 if-else 语句来解决这个问题,最终以 if-语句结束,如下所示:
if(first == '(' && (current == '}' || current == ']')) {
if first == '{' && (current == ']' || current == ')')) {
//and so on
我该如何将这个代码转换为switch case结构?这样做是否不好?
我知道左侧括号没有问题,但右侧的有问题。
编辑:目前代码的样子是怎样的?
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");
}
}
}
c = (Character) stack.Peek(); if (c != '{') { System.out.println("语法错误"); } else { stack.Pop(); }
- Jimmy