java - If else vs switch with stack 逻辑

标签 java if-statement stack switch-statement

我正在通过编写一个验证括号语法的程序来学习堆栈。如果我输入 (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

我怎样才能把它变成一个开关盒?这是一个坏主意吗?

据我所知,我的左侧支架确实没有问题,但右侧支架有问题。

编辑:代码现在的样子

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");
        }
    }
}

最佳答案

好问题!很高兴您已经有了可行的解决方案并正在努力改进它。

您仍然可以使用 switch 语句,但在尝试弹出下一个值之前,您首先需要验证您的堆栈不为空。在我的实现中,我首先通过检查 stack.isEmpty() 并使用短路 OR 条件 || 来进行检查。短路意味着如果 OR 条件的左侧为真,则右侧甚至不会被评估。

这是更新的 for 循环。我不确定您使用的是哪个 Stack 类,所以我使用的是 java.util.Stack

for(char c : arr) {

    switch(c) {

    case '{':
        stack.push(c);
        System.out.print(stack.peek());
        break;
    case '(':
        stack.push(c);
        System.out.print(stack.peek());
        break;
    case '[':
        stack.push(c);
        System.out.print(stack.peek());
        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;
    }
}

编辑:我添加了缺少的 break; 语句。如果没有这些,系统将执行多个 case: 条件,因为它会“失败”到每个条件。

编辑 2:李宗政在他们的回答中提出了一个很好的观点。完成后,您应该验证堆栈中没有任何遗留字符。在你的循环之后,你应该有这样的东西:

if(!stack.isEmpty()) {
    System.out.println("  Syntax ERROR");
}

编辑 3:将 stack.firstElement() 更改为 stack.peek()

关于java - If else vs switch with stack 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32510347/

相关文章:

java - 如何在 Spring 3 MVC 应用程序中对文件上传实现病毒扫描

Java+JSP : Query String handling

java - Cassandra - 将 PreparedStatement 与 ListenableFuture 结合使用

javascript - 如果同一变量等于字符串,则更改变量的值

java - 重现java.io.IOException : Data error (CRC)

javascript - 如何在 if 循环中只执行一次?

javascript - 如果数字以 1 结尾做某事

linux - 我们可以使用 __libc_stack_end 来确定 linux 上的堆栈结束吗?

c - 使用 fget 和解析

assembly - popl %esp 的替代方案