[式変換(25ポイント)]

トピック分析

最優先のすべての条項の、最も高い優先度の括弧、乗算または除算記号は次の優先順位であり、プラスまたはマイナス最も低い優先順位、デジタルとして、直接出力を満たすことができます。
それはデジタルであるため、小数、整数、正、負のポイントがあり、ならびに出力バイナリ演算子、括弧出力優先度にバイナリ演算子、優先度の高い優先コースの出力(ないブラケットああオン)
出力は次のような状況に分けることができるが、質問の意味。

  • (+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();
    }
} 

おすすめ

転載: www.cnblogs.com/KeepZ/p/11563413.html