スタックを使用して前置形式を後置形式に変換するプログラムを作成するように言われました。
紙と鉛筆を使用して関数を実装すると、今の出力は正しいはずです。ただし、コマンド ウィンドウに表示される結果は奇妙です。
実際の出力:
prefix : A
postfix : A
prefix : +*AB/CD
postfix : AB*CD/+
prefix : +-*$ABCD//EF+GH
postfix : AB$C*D-EF/GH+/H
prefix : +D/E+$*ABCF
postfix : DEAB*C$F+/F
prefix : /-*A+BCD-E+FG
postfix : ABC+DEFG+-+FG
正しい出力:
prefix : A
postfix : A
prefix : +*AB/CD
postfix : AB*CD/+
prefix : +-*$ABCD//EF+GH
postfix : AB$C*D-EF/GH+/+
prefix : +D/E+$*ABCF
postfix : DEAB*C$F+/+
prefix : /-*A+BCD-E+FG
postfix : ABC+*D-EFG+-/
コード:
void prefix_to_postfix(string& prefix, string& postfix)
{
//Convert the input prefix expression to postfix format
postfix = prefix; //initialize the postfix string to the same length of the prefix string
stack<stackItem> S;
stackItem x;
int k = 0; //index for accessing char of the postfix string
for (int i = 0; i < prefix.length(); i++) //process each char in the prefix string from left to right
{
char c = prefix[i];
if(prefix.length() == 1)
break;
//Implement the body of the for-loop
if(isOperator(c))
{
x.symb = c;
x.count = 0;
S.push(x);
}
else
{
S.top().count++;
postfix[k++] = c;
if(S.top().count == 2)
{
postfix[k++] = S.top().symb;
S.pop();
S.top().count++;
}
}
if(i == (prefix.length() - 1))
{
postfix[k++] = S.top().symb;
S.pop();
}
}
}