#include<iostream>
#include<stack>
#include<string>
#include<vector>
using namespace std;
int main(int argc,char* argv[])
{
//思路:
//第一部分:构建逆波兰表达是数组
//构建原则:
//1、遍历表达式字符串
//遇到左括号和乘除 无条件入栈
//遇到加减 把栈顶的乘除加减都弹出后再入栈
//(注意减号:当其前面为左括号或者无符号(i==0)时,需要补充一个0,否则需要当负数处理,入栈时该数需要添加负号)
//遇到 右括号 需要一直弹出栈顶加减乘除元素直至栈顶元素为左括号 (弹出当前的栈顶的左括号)
//其他情况 则为数值
//这里需要考虑 自然数大于个位数的情况,比如 100不能视为3个数而应该是单个数
// 0-9 的 ASCII 码为 48-57
//2、遍历栈内符号 弹出栈内所有的加减乘除元素
//第二部分:逆波兰表达式求值
//1、遍历逆波兰表达式 数组就入栈,符号就弹出2个栈顶元素 执行操作后再入栈
//2、此时栈顶元素就是最终表达式的结果值
string expressionStr="";
while(getline(cin,expressionStr))
{
vector<string> expressionVec;//表达式
stack<char> symbolSt;//符号栈
for(int i=0;i<expressionStr.length();i++)
{
if(expressionStr[i] =='(' || expressionStr[i] =='[' || expressionStr[i] =='{' || expressionStr[i] =='*' || expressionStr[i] =='/') symbolSt.push(expressionStr[i]);
else if(expressionStr[i] =='+' || expressionStr[i] =='-' )
{
if(expressionStr[i] =='-' && (i==0 || expressionStr[i-1] =='(' || expressionStr[i-1] =='[' || expressionStr[i-1] =='{' ))
{
expressionVec.push_back("0");
symbolSt.push(expressionStr[i]);
}
else
{
while(!symbolSt.empty() && (symbolSt.top()=='*' || symbolSt.top()=='/' || symbolSt.top()=='+' || symbolSt.top()=='-'))
{
if(symbolSt.top()=='*') expressionVec.push_back("*");
else if(symbolSt.top()=='/') expressionVec.push_back("/");
else if(symbolSt.top()=='+') expressionVec.push_back("+");
else if(symbolSt.top()=='-') expressionVec.push_back("-");
symbolSt.pop();
}
symbolSt.push(expressionStr[i]);
}
}
else if(expressionStr[i] ==')' || expressionStr[i] ==']' || expressionStr[i] =='}')
{
while(!symbolSt.empty() && symbolSt.top() !='(' && symbolSt.top() !='[' && symbolSt.top() !='{')
{
if(symbolSt.top()=='*') expressionVec.push_back("*");
else if(symbolSt.top()=='/') expressionVec.push_back("/");
else if(symbolSt.top()=='+') expressionVec.push_back("+");
else if(symbolSt.top()=='-') expressionVec.push_back("-");
symbolSt.pop();
}
symbolSt.pop();
}
else
{
string temp="";
while(i<expressionStr.length()-1 && expressionStr[i+1]>=48 && expressionStr[i+1]<=57) temp+= expressionStr[i++];
temp+= expressionStr[i];
expressionVec.push_back(temp);
}
}
while(!symbolSt.empty())
{
if(symbolSt.top()=='*') expressionVec.push_back("*");
else if(symbolSt.top()=='/') expressionVec.push_back("/");
else if(symbolSt.top()=='+') expressionVec.push_back("+");
else if(symbolSt.top()=='-') expressionVec.push_back("-");
symbolSt.pop();
}
stack<int> resultSt;
for(int i=0;i<expressionVec.size();i++)
{
if(expressionVec[i] == "*" || expressionVec[i] == "/" || expressionVec[i] == "+" || expressionVec[i] == "-")
{
int temp1=resultSt.top();
resultSt.pop();
int temp2=resultSt.top();
resultSt.pop();
int temp3=0;
if(expressionVec[i] == "*") temp3=temp2 * temp1;
else if(expressionVec[i] == "/") temp3=temp2 / temp1;
else if(expressionVec[i] == "+") temp3=temp2 + temp1;
else if(expressionVec[i] == "-") temp3=temp2 - temp1;
resultSt.push(temp3);
}else resultSt.push(atoi(expressionVec[i].c_str()));
}
int res=resultSt.top();
resultSt.pop();
cout<<res<<endl;
}
return 0;
}
#include<stack>
#include<string>
#include<vector>
using namespace std;
int main(int argc,char* argv[])
{
//思路:
//第一部分:构建逆波兰表达是数组
//构建原则:
//1、遍历表达式字符串
//遇到左括号和乘除 无条件入栈
//遇到加减 把栈顶的乘除加减都弹出后再入栈
//(注意减号:当其前面为左括号或者无符号(i==0)时,需要补充一个0,否则需要当负数处理,入栈时该数需要添加负号)
//遇到 右括号 需要一直弹出栈顶加减乘除元素直至栈顶元素为左括号 (弹出当前的栈顶的左括号)
//其他情况 则为数值
//这里需要考虑 自然数大于个位数的情况,比如 100不能视为3个数而应该是单个数
// 0-9 的 ASCII 码为 48-57
//2、遍历栈内符号 弹出栈内所有的加减乘除元素
//第二部分:逆波兰表达式求值
//1、遍历逆波兰表达式 数组就入栈,符号就弹出2个栈顶元素 执行操作后再入栈
//2、此时栈顶元素就是最终表达式的结果值
string expressionStr="";
while(getline(cin,expressionStr))
{
vector<string> expressionVec;//表达式
stack<char> symbolSt;//符号栈
for(int i=0;i<expressionStr.length();i++)
{
if(expressionStr[i] =='(' || expressionStr[i] =='[' || expressionStr[i] =='{' || expressionStr[i] =='*' || expressionStr[i] =='/') symbolSt.push(expressionStr[i]);
else if(expressionStr[i] =='+' || expressionStr[i] =='-' )
{
if(expressionStr[i] =='-' && (i==0 || expressionStr[i-1] =='(' || expressionStr[i-1] =='[' || expressionStr[i-1] =='{' ))
{
expressionVec.push_back("0");
symbolSt.push(expressionStr[i]);
}
else
{
while(!symbolSt.empty() && (symbolSt.top()=='*' || symbolSt.top()=='/' || symbolSt.top()=='+' || symbolSt.top()=='-'))
{
if(symbolSt.top()=='*') expressionVec.push_back("*");
else if(symbolSt.top()=='/') expressionVec.push_back("/");
else if(symbolSt.top()=='+') expressionVec.push_back("+");
else if(symbolSt.top()=='-') expressionVec.push_back("-");
symbolSt.pop();
}
symbolSt.push(expressionStr[i]);
}
}
else if(expressionStr[i] ==')' || expressionStr[i] ==']' || expressionStr[i] =='}')
{
while(!symbolSt.empty() && symbolSt.top() !='(' && symbolSt.top() !='[' && symbolSt.top() !='{')
{
if(symbolSt.top()=='*') expressionVec.push_back("*");
else if(symbolSt.top()=='/') expressionVec.push_back("/");
else if(symbolSt.top()=='+') expressionVec.push_back("+");
else if(symbolSt.top()=='-') expressionVec.push_back("-");
symbolSt.pop();
}
symbolSt.pop();
}
else
{
string temp="";
while(i<expressionStr.length()-1 && expressionStr[i+1]>=48 && expressionStr[i+1]<=57) temp+= expressionStr[i++];
temp+= expressionStr[i];
expressionVec.push_back(temp);
}
}
while(!symbolSt.empty())
{
if(symbolSt.top()=='*') expressionVec.push_back("*");
else if(symbolSt.top()=='/') expressionVec.push_back("/");
else if(symbolSt.top()=='+') expressionVec.push_back("+");
else if(symbolSt.top()=='-') expressionVec.push_back("-");
symbolSt.pop();
}
stack<int> resultSt;
for(int i=0;i<expressionVec.size();i++)
{
if(expressionVec[i] == "*" || expressionVec[i] == "/" || expressionVec[i] == "+" || expressionVec[i] == "-")
{
int temp1=resultSt.top();
resultSt.pop();
int temp2=resultSt.top();
resultSt.pop();
int temp3=0;
if(expressionVec[i] == "*") temp3=temp2 * temp1;
else if(expressionVec[i] == "/") temp3=temp2 / temp1;
else if(expressionVec[i] == "+") temp3=temp2 + temp1;
else if(expressionVec[i] == "-") temp3=temp2 - temp1;
resultSt.push(temp3);
}else resultSt.push(atoi(expressionVec[i].c_str()));
}
int res=resultSt.top();
resultSt.pop();
cout<<res<<endl;
}
return 0;
}