2012-10-09 521 views
0

我應該創建一個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 

任何人都可以請幫我開發的驅動程序打印出來的輸出類似於示例示例? 任何幫助表示讚賞。謝謝!

+0

所以你需要命令行io的幫助? – dngfng

+0

修改checkExpression方法打印出來的時候,一對托架的匹配失敗。 – nhahtdh

+0

我無法設置我的驅動程序來打印**輸出**使用** Input ** StreamReader和BufferedReader的表達式 我無法理解這部分,您想向用戶顯示一些文本? – Gianmarco

回答

0

if語句checkExpression方法使用的是

stExpression.equals()

,而你想要做的是「窺視」在上的頂部的值疊加。

添加彈出的值,再將它推回,並返回它應該解決的問題(至少該部分)簡單的方法。

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; 

    } 

}