インフィクスを後置に変換するプログラムを書くことになっています。それはいくつかの場合には正しく動作しますが、他の時は正しく動作しません。特に小括弧を含む中置式について。誰が私にこのことが間違っているのかを伝えることができますか?例えば、中置式インフィクスからポストフィックスへのプログラムが動作しない
((5 + 5 * (6 - 2) + 4^2) * 8)
は、5562-*42^++8*((2
を返します。
import java.io.*;
import java.util.Scanner;
public class InfixToPostfix
{
//class attributes
private char curValue;
private String postfix;
private LineWriter lw;
private ObjectStack os;
//constructor
public InfixToPostfix(LineWriter l, ObjectStack o)
{
curValue = ' ';
lw=l;
os=o;
}
public String conversion(String buf)
{
String temp =" ";
StringBuffer postfixStrBuf= new StringBuffer(temp);
char popped= new Character(' ');
char topped=' ';
for (int i=0; i<buf.length(); i++)
{
curValue= buf.charAt(i);
if (curValue == '(')
os.push(curValue);
if (curValue == ')')
{
while (popped != '(')
{
popped = ((Character)os.pop());
if (popped != '(')
postfixStrBuf.append(popped);
}
}
if (isOperator(curValue))
{
if(os.isEmpty())
os.push((Character)(curValue));
else
topped=((Character)os.top());
if ((priority(topped)) >= (priority(curValue)) && (topped != ' '))
{
popped = ((Character)os.pop());
if (popped != '(')
postfixStrBuf.append(popped);
//if it is a left paranthess, we want to go ahead and push it anyways
os.push((Character)(curValue));
}
if ((priority(topped)) < (priority(curValue)) && (topped != ' '))
os.push((Character)(curValue));
}
else if (!isOperator(curValue) && (curValue != ' ') && (curValue != '(') && (curValue != ')'))
postfixStrBuf.append(curValue);
}
//before you grab the next line of the file , pop off whatever is remaining off the stack and append it to
//the infix expression
getRemainingOp(postfixStrBuf);
return postfix;
//postfixStrBuf.delete(0, postfixStrBuf.length());
}
public int priority(char curValue)
{
switch (curValue)
{
case '^': return 3;
case '*':
case '/': return 2;
case '+':
case '-': return 1;
default : return 0;
}
}
public boolean isOperator(char curValue)
{
boolean operator = false;
if ((curValue == '^') || (curValue == '*') || (curValue == '/') || (curValue == '+') || (curValue == '-'))
operator = true;
return operator;
}
public String getRemainingOp(StringBuffer postfixStrBuf)
{
char popped=' ';
while (!(os.isEmpty()))
{
opped = ((Character)os.pop());
postfixStrBuf.append(popped);
}
postfix=postfixStrBuf.toString();
return postfix;
}
}
あなたのコードを読む私はあなたの質問に答える気がしません。 – Alexander
これは答えが明白であるか、それが意味をなさないためですか? – user1175955