java - 我需要在后缀表示法中的数字和字符之间添加空格

标签 java postfix-notation

我正在运行一个 PostFix 表示法 Java 程序。

当我输入 $(10*10) -30 时 输出为 1010* $30-

现在我想在数字和字符之间添加空格。我想要

10 10 * 30 美元 -

结果。我怎样才能让程序输入10而不是1和0。

这是到目前为止的代码

class InToPost // infix to postfix conversion
{
private StackX theStack;
private String input;
private String output = "";
//--------------------------------------------------------------
public InToPost(String in) // constructor
{
    input = in;
    int stackSize = input.length();
    theStack = new StackX(stackSize);
}
//--------------------------------------------------------------
public String doTrans() // do translation to postfix
{
    for(int j=0; j<input.length(); j++)
    {
        char ch = input.charAt(j);
        theStack.displayStack("For "+ch+" "); // *diagnostic*
        switch(ch)
        {
            case '+': // its + or -    
            case '-':   
                gotOper(ch, 1); // go pop operators
                break; // (precedence 1)

            case '*': // its * or / or $
            case '/':
            case '$':
                gotOper(ch, 2); // go pop operators
                break; // (precedence 2)

            case '(': // its a left paren
                theStack.push(ch); // push it
                break;

            case ')': // its a right paren
                gotParen(ch); // go pop operators
                break;              

            default: // must be an operand
                output = output + ch ; // write it to output
            break;

         }// end switch
    } // end for
    while( !theStack.isEmpty() ) // pop remaining opers
    {
        theStack.displayStack("While "); // *diagnostic*
        output += theStack.pop() + " "; // write to output
    }
    theStack.displayStack("End "); // *diagnostic*
    return output; // return postfix
} // end doTrans()
//--------------------------------------------------------------
public void gotOper(char opThis, int prec1)
{ // got operator from input
    while( !theStack.isEmpty() )
    {
        char opTop = theStack.pop();
        if( opTop == '(' ) // if its a (
        {
            theStack.push(opTop); // restore (
            break;
        }
        else // its an operator
        {
            int prec2; // precedence of new op
            if(opTop== '+' || opTop == '-' ) // find new op prec
                prec2 = 1;
            else
                prec2 = 2;
            if(prec2 < prec1) // if prec of new op less
            { // than prec of old
                theStack.push(opTop); // save newly-popped op
                break;
            }
            else // prec of new not less
                output = output + opTop; // than prec of old
        } // end else (its an operator)
    } // end while
    theStack.push(opThis); // push new operator
} // end gotOp()
//--------------------------------------------------------------
public void gotParen(char ch)
{ // got right paren from input
    while( !theStack.isEmpty() )
    {
        char chx = theStack.pop();
        if( chx == '(' ) // if popped (
            break; // were done
        else // if popped operator
            output = output + chx; // output it
    } // end while
} // end popOps()
//--------------------------------------------------------------
} // end class InToPost


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

class InfixApp
    {
    public static void main(String[] args) throws IOException
    {
        String input, output;
            while(true)
            {
                System.out.print("Enter infix: ");
                System.out.flush();
                input = getString(); // read a string from kbd
                if( input.equals("") ) // quit if [Enter]
                    break;
                // make a translator
                InToPost theTrans = new InToPost(input);
                output = theTrans.doTrans(); // do the translation
                System.out.println("Postfix is " + output + '\n');
            } // end while
    } // end main()
    //--------------------------------------------------------------
    public static String getString() throws IOException
    {
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        String s = br.readLine();
        return s;
    }

    } // end class InfixApp

    import java.io.*; // for I/O
class StackX
{
    private int maxSize;
    private char[] stackArray;
    private int top;
    //--------------------------------------------------------------
    public StackX(int s) // constructor
    {
        maxSize = s;
        stackArray = new char[maxSize];
        top = -1;
    }
    //--------------------------------------------------------------
    public void push(char j) // put item on top of stack
        { stackArray[++top] = j; }
    //--------------------------------------------------------------
    public char pop() // take item from top of stack
        { return stackArray[top--]; }
    //--------------------------------------------------------------
    public char peek() // peek at top of stack
        { return stackArray[top]; }
    //--------------------------------------------------------------
    public boolean isEmpty() // true if stack is empty
        { return (top == -1); }
    //-------------------------------------------------------------
    public int size() // return size
        { return top+1; }
    //--------------------------------------------------------------
    public char peekN(int n) // return item at index n
        { return stackArray[n]; }
    //--------------------------------------------------------------
    public void displayStack(String s)
    {
        System.out.print(s);
        System.out.print("Stack (bottom-->top): ");
        for(int j=0; j<size(); j++)
        {
            System.out.print( peekN(j) );
            System.out.print(" ");
        }
        System.out.println(" ");
    }
} // end class StackX

谢谢!!

最佳答案

我认为您可以在检测到这样的分界标记后添加空格:

    public String doTrans() // do translation to postfix
    {
        for(int j=0; j<input.length(); j++)
        {
            char ch = input.charAt(j);
            theStack.displayStack("For "+ch+" "); // *diagnostic*
            switch(ch)
            {
                case '+': // its + or -
                case '-':
                    output += " ";
                    gotOper(ch, 1); // go pop operators
                    break; // (precedence 1)

                case '*': // its * or / or $
                case '/':
                case '$':
                    output += " ";
                    gotOper(ch, 2); // go pop operators
                    break; // (precedence 2)

                case '(': // its a left paren
                    theStack.push(ch); // push it
                    break;

                case ')': // its a right paren
                    output += " ";
                    gotParen(ch); // go pop operators
                    break;

                default: // must be an operand
                    output = output + ch ; // write it to output
                    break;

            }// end switch
        } // end for
        output += " ";
        while( !theStack.isEmpty() ) // pop remaining opers
        {
            theStack.displayStack("While "); // *diagnostic*
            output += theStack.pop(); // write to output
        }
        theStack.displayStack("End "); // *diagnostic*
        return output; // return postfix
    } // end doTrans()

附注Comments are redundant if they duplicate the code

关于java - 我需要在后缀表示法中的数字和字符之间添加空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29265365/

相关文章:

java - 对 https endint 的 curl 请求正常工作,但 java 客户端请求失败,错误为 'javax.net.ssl.SSLHandshakeException'

java - 在 Tic-Tac-Toe 中寻找获胜者(使用 2-D 数组的 Java)

java - 尝试理解存储 stringAt()

algorithm - 逆波兰表示法的简化算法

c - 使用堆栈的中缀到后缀的转换

java - Dagger 2 Inject 注释破坏了注入(inject)

c - 如何将字符串从文件传递到函数?将中缀转换为后缀

C++后缀评估问题

perl - 是否支持散列上的 postderef 语法?

java - Mysql和java socket并行压力测试