用于读取括号,花括号和括号的Java程序

时间:2012-10-09 10:41:46

标签: java

我应该创建一个Java程序来读取包含括号{}等其他项的表达式, 括号[]和括号()。我的计划应该是正确的 嵌套和'('匹配')','['匹配']'和'{'匹配'}' 程序应该在输入行的开头用'$'终止。 这些应该是我的程序的示例运行:

Enter an Expression:
A[F + X {Y – 2}] 
The expression is Legal

Enter an Expression: 
B+[3 – {X/2})*19 + 2/(X – 7) 
ERROR—‘]’ expected 

Enter an Expression:
()) ( 
ERROR--‘)’ without ‘(‘ 
$

我创建了一个名为BalancedExpression的类和一个名为ExpressionChecker的驱动程序。 我完成了我的BalancedExpression类。但是,我在设置驱动程序时无法使用InputStreamReader和BufferedReader打印出表达式。我唯一能弄清楚的是如何让用户输入$。

来终止我的程序

到目前为止,这是我的代码:

平衡表达式类:

public class BalancedExpression
{
public BalancedExpression() // Default Constructor
{
  sp = 0; // the stack pointer
  theStack = new int[MAX_STACK_SIZE]; 
} 

public void push(int value) // Method to push an expression into the stack
{ 
  if (!full()) 
    theStack[sp++] = value; 
} 

public int pop() // Method to pop an expression out of the stack
{ 
  if (!empty()) 
    return theStack[--sp]; 

  else 
    return -1;  
} 

public boolean full() // Method to determine if the stack is full
{ 
  if (sp == MAX_STACK_SIZE) 
    return true; 

  else 
    return false; 
} 

public boolean empty() // Method to determine if the stack is empty
{ 
  if (sp == 0) 
    return true; 

  else 
    return false; 
} 

public static boolean checkExpression(String ex) // Method to check Expression in stack
{
    BalancedExpression stExpression = new BalancedExpression();
    for(int i = 0; i<  MAX_STACK_SIZE; i++)
    {
        char ch = ex.charAt(i);
        if(ch == '(' || ch == '{' ||  ch == '[')
            stExpression.push(ch);
        else if(ch == ')' && !stExpression.empty() && stExpression.equals('('))
            stExpression.pop();
        else if(ch == '}' && !stExpression.empty() && stExpression.equals('{'))
            stExpression.pop();
        else if(ch == ']' && !stExpression.empty() && stExpression.equals('['))
            stExpression.pop();
        else if(ch == ')' || ch == '}' ||  ch == ']' )
            return false;
    }
    if(!stExpression.empty())
        return false;
    return true;
}

private int sp; 
private int[] theStack; 
private static final int MAX_STACK_SIZE = 6;

}// End of class BalancedExpression

我的司机程序:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ExpressionChecker
{

public static void main(String[] args) 
{
    InputStreamReader reader = new InputStreamReader(System.in); 
    BufferedReader console = new BufferedReader(reader); 

    BalancedExpression exp = new BalancedExpression();
    String expression = "";

    do
    {
        try{
        System.out.print("Enter an Expression: ");
        expression = console.readLine();

        if("$".equals(expression)) 
            break;

        }catch(Exception e){
            System.out.println("IO error:" + e);
        }

    }while(!expression.equals(""));// End of while loop
}
}// End of class ExpressionChecker

任何人都可以帮我开发我的驱动程序来打印出类似示例的输出吗? 任何帮助表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:0)

checkExpression 方法中的 if语句中,您正在使用

  

stExpression.equals()

虽然你想要做的是'偷看'堆栈顶部的值。

添加弹出值的简单方法,将其推回并返回它应解决问题(至少这一部分)。

答案 1 :(得分:0)

这是一个非常简短的例子,你可以很容易地进行上述检查:)我们在Java中有Stack类,它将使程序变得非常简单。请在下面找到此问题的简单代码:

package com.test;

import java.util.Scanner;
import java.util.Stack;

public class StackChar {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.println("Enete an expression : ");
        String expr = sc.nextLine();

        if(checkvalidExpression(expr)){
            System.out.println("The Expression  '"+expr+"'  is a valid expression!!!");
        }
        else{
            System.out.println("The Expression  '"+expr+"'  is a NOT a valid expression!!!");
        }

    }

    public static boolean checkvalidExpression(String expr){

        Stack<Character> charStack = new Stack<Character>();

        int len = expr.length();
        char exprChar = ' ';

        for(int indexOfExpr = 0; indexOfExpr<len; indexOfExpr++){
            exprChar = expr.charAt(indexOfExpr);

            if(exprChar == '(' || exprChar == '{' ||  exprChar == '['){
                charStack.push(exprChar);
            }
            else if(exprChar == ')' && !charStack.empty()){
                if(charStack.peek() == '('){
                    charStack.pop();
                }
            }
            else if(exprChar == '}' && !charStack.empty()){
                if(charStack.peek() == '{'){
                    charStack.pop();
                }
            }
            else if(exprChar == ']' && !charStack.empty()){
                if(charStack.peek() == '['){
                    charStack.pop();
                }
            }

            else if(exprChar == ')' || exprChar == '}' ||  exprChar == ']' ){
                return false;
            }

        }
        if(!charStack.empty())
            return false;

        return true;

    }

}