使2+3*(7-4)+8/4变成2 3 7 4 - * + 8 4 / +的编程程序
请设计程序将中缀表达式转换为后缀表达式。输入输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。输出在一行中输出转换后的后...
请设计程序将中缀表达式转换为后缀表达式。
输入输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。输出在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。 展开
输入输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。输出在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。 展开
1个回答
展开全部
这个是我之前写的代码,只是没把括号的情况加进去。你参考参考
std::vector<std::string> PostFixStatement::infixToPostfix(const std::vector<std::string> &initialStmt)
{
std::stack<std::string> first;
std::stack<std::string> second;
first.push(initialStmt[0]);
for (size_t i = 1; i < initialStmt.size(); i++)
{
//if the precedence of parameter 1 is lower than parameter 2
//it will be pop from the stack and add to final expression (store in stack 2)
while (!first.empty() && checkPrecedence(first.top(), initialStmt[i]))
{
second.push(first.top());
first.pop();
}
first.push(initialStmt[i]);
}
//pop out everything
while (!first.empty())
{
second.push(first.top());
first.pop();
}
//create return list
std::vector<std::string> result(initialStmt.size());
for (int i = (int) initialStmt.size() - 1; i >= 0; i--)
{
result[i] = second.top();
second.pop();
}
return result;
}
//check for operator
bool isOperator(const std::string &str)
{
return ((str == "-") || (str == "+") || (str == "*"));
}
//return true if str1 has higher or equal precedence than str2
bool checkPrecedence(const std::string &str1, const std::string &str2)
{
if (isOperator(str1) && isOperator(str2))
{
if ((str1 == "+" || str1 == "-") && str2 == "*")
{
return false;
}
}
else if (isOperator(str1) && !isOperator(str2))
{
return false;
}
return true;
}
std::vector<std::string> PostFixStatement::infixToPostfix(const std::vector<std::string> &initialStmt)
{
std::stack<std::string> first;
std::stack<std::string> second;
first.push(initialStmt[0]);
for (size_t i = 1; i < initialStmt.size(); i++)
{
//if the precedence of parameter 1 is lower than parameter 2
//it will be pop from the stack and add to final expression (store in stack 2)
while (!first.empty() && checkPrecedence(first.top(), initialStmt[i]))
{
second.push(first.top());
first.pop();
}
first.push(initialStmt[i]);
}
//pop out everything
while (!first.empty())
{
second.push(first.top());
first.pop();
}
//create return list
std::vector<std::string> result(initialStmt.size());
for (int i = (int) initialStmt.size() - 1; i >= 0; i--)
{
result[i] = second.top();
second.pop();
}
return result;
}
//check for operator
bool isOperator(const std::string &str)
{
return ((str == "-") || (str == "+") || (str == "*"));
}
//return true if str1 has higher or equal precedence than str2
bool checkPrecedence(const std::string &str1, const std::string &str2)
{
if (isOperator(str1) && isOperator(str2))
{
if ((str1 == "+" || str1 == "-") && str2 == "*")
{
return false;
}
}
else if (isOperator(str1) && !isOperator(str2))
{
return false;
}
return true;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |