トピック分析
最優先のすべての条項の、最も高い優先度の括弧、乗算または除算記号は次の優先順位であり、プラスまたはマイナス最も低い優先順位、デジタルとして、直接出力を満たすことができます。
それはデジタルであるため、小数、整数、正、負のポイントがあり、ならびに出力バイナリ演算子、括弧出力優先度にバイナリ演算子、優先度の高い優先コースの出力(ないブラケットああオン)
出力は次のような状況に分けることができるが、質問の意味。
- (+1 ......
- 正の符号ではなく、出力のための+1 ......
- -1 ......
- 3
- 34 ...
- 3.4 ...
(注:上記の数値に...未知の長さの束参照) - これらのシンボルのシンボル、すなわち、その出力スタックに由来するその対応するブラケットとの間)を打ちます。
いくつかのケースは以下に述べる問題点出力部、上記で議論されている、バイナリ演算子スタックに挿入されます。 - 優先順位は、バイナリ演算子スタックの現在の優先順位よりも小さいか、スタックがオペレータ空である場合、二項演算子を導入しました。
- オペレータスタックまたは現在の優先度に等しい、バイナリ演算子の優先順位よりも大きい場合には、次の2つの場合に分け、オペレータがスタック(シンボルの先頭である場合、オペレータは、直接挿入することができ、2オペレータがスタックされていない場合、それは(またはシンボルスタックが空である場合、現在のバイナリ演算子挿入するまで(シンボルが優先スタック内の出力要素です。
正しいコード
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
#include<map>
using namespace std;
stack<char> sign;
char s[22];
map<char, int> mp;
int main()
{
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
mp['+'] = mp['-'] = 1;
mp['*'] = mp['/'] = 2;
mp['('] = mp[')'] = 3;
scanf("%s", s);
int len = strlen(s);
bool isfirst = true;
for(int i = 0; i < len; i++)
{
if((!i || (i && s[i-1] == '(')) && (s[i] == '+' || s[i] == '-'))
{
if(!isfirst)
printf(" ");
if(s[i] != '+')
printf("%c",s[i]);
while(i + 1 < len && (s[i+1] == '.' || (s[i+1] >= '0' && s[i+1] <= '9')))
{
++i;
printf("%c", s[i]);
}
if(isfirst)
isfirst = false;
}
else if(s[i] >= '0' && s[i] <= '9')
{
if(!isfirst)
printf(" ");
printf("%c", s[i]);
while(i + 1 < len && (s[i+1] == '.' || (s[i+1] >= '0' && s[i+1] <= '9')))
{
++i;
printf("%c", s[i]);
}
if(isfirst)
isfirst = false;
}
else if(s[i] == ')')
{
while(!sign.empty() && sign.top() != '(')
{
printf(" %c", sign.top());
sign.pop();
}
if(!sign.empty() && sign.top() == '(')
sign.pop();
}
else if(sign.empty() || (mp[s[i]] > mp[sign.top()]))
sign.push(s[i]);
else
{
while(!sign.empty() && sign.top() != '(')
{
printf(" %c", sign.top());
sign.pop();
}
sign.push(s[i]);
}
}
while(!sign.empty())
{
printf(" %c", sign.top());
sign.pop();
}
}