java - 有限状态机程序无效输出

标签 java expression

我正在开发一个项目,但我的代码无法运行,不知道为什么。给定测试程序和通用类,我需要一个满足以下逻辑正则表达式的程序:

L1:对于字母表 {a,b},包含奇数个 a 和恰好一个 b 的所有字符串。

测试输入:aabaaaa、aaabaaaa、aabaaaab、baaaaaa、aaaaabaa

它应该是什么:

aabaaaa错误

aaabaaaa 正确

aabaaaab 错误

baaaaaa假

aaaaabaa 正确

程序输出: (真,真,真,假,真)

我的测试程序:

import java.util.Scanner;

// Test Finite State Machine Class
public class TestFSML1
{
  public static void main(String[] args){
    String A = "ab";
    int[][] ST = {{1,3,0},
            {1,2,1},
            {2,2,2},
            {3,3,3}};
    int[] AS = {0,0,1,0};
    Scanner in = new Scanner(System.in);
    String inString;
    boolean accept1 = false;
    FSM FSM1 = new FSM(A, ST, AS);

// Input string is command line parameter
    System.out.println("     Input       Accepted:");

    for(int i=0;i<args.length;i++) {
      inString = args[i];
      accept1 = FSM1.validString(inString);

      System.out.printf("%10s%13s\n",inString, accept1);
    }
  } // end main
} // end class

FSM 类

// Finite State Machine Class
public class FSM
{
  // Instance variables
  public  String alphabet;
  public  int    stateTrans[][];
  public  int    acceptState[];
  private int    cstate;

  // Constructor function

  public FSM(String A, int[][] ST, int[] AS)
  {
    int NSYMBOLS = A.length();
    int NSTATES  = AS.length;
    // Alphabet
    alphabet = "" + A;
    // State transition table
    stateTrans = new int[NSTATES][NSYMBOLS];
    for(int r = 0; r < NSTATES; r++)
      for(int c = 0; c < NSYMBOLS; c++)
        stateTrans[r][c] = ST[r][c];
    // Accept states
    acceptState = new int[NSTATES];
    for(int r = 0; r < NSTATES; r++)
      acceptState[r] = AS[r];
    // Start state
    cstate = 0;
  } 

  // Methods

  public int getState()
  {
    return cstate;
  }

  public void setState(int state)
  {
    cstate = state;
    return;
  }

  public int nextState(char symbol)
  {
    int nstate = -1;
    int col = alphabet.indexOf(symbol);
    if(col >= 0)
      nstate = stateTrans[cstate][col];
    return nstate;
  }

  public boolean accept(int state)
  {
    if(state < 0)
      return false;
    return (acceptState[state] != 0);
  }

  public boolean validString(String word)
  {
    cstate = 0;
    for(int k = 0; k < word.length(); k++){
      cstate = nextState(word.charAt(k));
      System.out.print(cstate);
      System.out.println("  " + word.charAt(k));
      if(cstate < 0)
        return false;
    }
    return accept(cstate);
  }


} // end class

谢谢!

最佳答案

这是我输入的一个简单方法,用于执行您想要的任务。

public static boolean validWord(String s) {

        int aCounter = 0;
        int bCounter = 0;
        char c;

        for (int i = 0; i < s.length(); i++) {

            c = s.charAt(i);

            if ((int) c == (int) 'a') {

                aCounter++;
            } else {

                bCounter++;
            }
        }

        return (aCounter % 2 == 1 && bCounter == 1);
    }

我很难理解你是如何实现你的方法的,我认为它可以更简单。我确信您包含在 FSM 类中的实例变量还有其他用途,但您实际上并不需要它们中的任何一个来分析字符串。只需使用这样的东西,它应该很容易集成到您的代码中,因为它只需要字符串。希望这有帮助!

关于java - 有限状态机程序无效输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53662711/

相关文章:

java - 类型安全 : Unchecked cast

c# - 创建表达式以使用 out 参数调用方法

c++ - 当我混合有符号和无符号类型时会发生什么?

Magento 集合表达式

java - Spring-boot 和 Keycloak 集成

java - Spring Webflux 在返回响应之前等待所有 Flux<T>

java - 我可以通过 JNDI 查找 EJB 并使用反射调用方法吗?

java - 从java中的特定位置提取文本

c - 错误前的预期表达

python - 生成器表达式使用生成器创建后分配的列表