string make_symbol_stack(string opt)
{
stack<char> symbol_stack;
char result[100] = {'0'};
memset(result, 0, 100);
int index = 0;
int last_order = 0;
int cur_order = 0;
int symbol_to_order[128];
symbol_to_order['+'] = 0;
symbol_to_order['-'] = 0;
symbol_to_order['*'] = 1;
symbol_to_order['/'] = 1;
int flag = 0;
for (int i = 0; i < opt.length(); i++)
{
if ('0' <= opt[i] && opt[i] <= '9')
{
result[index++] = opt[i];
flag = 0;
}
else if (opt[i] == ' ')
{
//跳过
}
else
{//symbol
if (flag == 0)//只要把数字与数字之间切分开,即可
{
result[index++] = ' ';
flag = 1; //表示符号
}
if (symbol_stack.empty())
{
symbol_stack.push(opt[i]);
}
else
{
char symbol = symbol_stack.top();
last_order = symbol_to_order[symbol];
cur_order = symbol_to_order[opt[i]];
if (cur_order >= last_order || opt[i] == '(')//优先级高,则直接入栈
{
symbol_stack.push(opt[i]);
}
else//优先级低,则先出栈到合适位置,再入栈
{
if (opt[i] == ')')
{
while (symbol_stack.top() != '(')
{
symbol = symbol_stack.top();
symbol_stack.pop();
result[index++] = symbol;
}
symbol_stack.pop();
}
else
{
while (!symbol_stack.empty())
{
symbol = symbol_stack.top();
symbol_stack.pop();
result[index++] = symbol;
}
symbol_stack.push(opt[i]);
}
}
}
}
}
while (!symbol_stack.empty())
{
char symbol = symbol_stack.top();
symbol_stack.pop();
result[index++] = symbol;
}
string ret(result, result + strlen(result));
return ret;
}
int compute_opt(string opt)
{
cout << "输入:" << opt<<endl;
string result = make_symbol_stack(opt);
cout << "后缀:" << result<<endl;
stack<int> value_stack;
for (int i = 0; i < result.length();i++)
{
if ('0' <= result[i] && result[i] <= '9')
{
int value = 0;
while (isdigit(result[i]))
{
value = value * 10 + (result[i] - '0');
i++;
}
i = i - 1;
value_stack.push(value);
}
else if (result[i] == ' ')
{
}
else
{//symbol
int value1 = value_stack.top();
value_stack.pop();
int value2 = value_stack.top();
value_stack.pop();
int tmp;
if (result[i] == '+')
{
tmp = value2 + value1;
}
else if (result[i] == '-')
{
tmp = value2 - value1;
}
else if (result[i] == '*')
{
tmp = value2*value1;
}
else//'/'
{
tmp = value2 / value1;
}
value_stack.push(tmp);
}
}
int ret = value_stack.top();
cout << "结果:" << ret << endl;
return ret;
}
string content("9+(3-1)*3+10/2");
int result = compute_opt(content);