接尾辞式変換接尾辞式(逆ポーランド式)
2148 ワード
C++に適した変換方法
個人的にはこの書き方がきれいだと思います
個人的にはこの書き方がきれいだと思います
#include
#include
#include
using namespace std;
/* (RPN)
【 】
1. ,
2. ,
3. , , ( , )
4.
1. , , 【 】 ( )
2. , , 4.1
*/
string RPN(string& exp)
{
stack opStack;
string rString;
const string blank = " ";
int len = exp.length();
for(int i = 0; i < len; i++)
{
char ch = exp.at(i);
switch (ch)
{
case ' ':
break;
case '(':
opStack.push(ch);
break;
case ')':
while( ( ch = opStack.top() ) != '(')
{
rString.append(blank + ch);
opStack.pop();
}
case '+':
case '-':
case '*':
case '/':
while(1)
{
if( opStack.empty() ||
opStack.top() == '(' ||
( ch == '*' || ch == '/' ) &&
(opStack.top() == '+' || opStack.top() == '-')
)
{
opStack.push(ch);
break;
}
else
{
rString.append(blank + opStack.top());
opStack.pop();
}
}
break;
//
default:
rString.append(blank + ch);
break;
}
}
while( !opStack.empty())
{
if(opStack.top() != '(')
rString.append(blank + opStack.top());
opStack.pop();
}
return rString;
}
int main()
{
string exp;
while(1)
{
getline(cin,exp);
if(exp != "#")
cout << exp << " , " << RPN(exp) << endl;
else
break;
}
return 0;
}