判断是否是数字,是数字直接加入后缀
if (suf >="0" && suf<="9")
碰到运算符
先判断是不是右括号,如果是右括号,则一直出栈一直到栈空或者碰到"("。
如果不是右括号且栈空
则直接入栈
如果不是右括号但栈不空,则需要和栈顶的元素进行优先级比较
如果栈顶元素优先级大于等于该元素,则栈顶元素出栈,一直出栈到栈顶元素的优先级小于该元素或者栈为空,此时将该元素入栈。
优先级比较函数priority 的实现思路
return false; 表示栈顶不需要出栈。 return true; 该栈顶需要出栈
如果栈顶元素是"("则该元素直接入栈 return false;
如果该元素是"("也直接入栈 return false;
如果栈顶元素是* 或 / ,那么该栈顶元素的优先级一定大于等于该元素,则栈顶元素出栈。return true;
如果栈顶元素是+ - ,那么该元素需要是* / 才return true; 否则也是return false;
c++完整实现代码如下
bool priority(string stack_opera,string opera)
{
if (stack_opera == "(" ||opera == "(") //stack_opera和opera是( 则一定不需要出栈
return false;
if (stack_opera == "*" || stack_opera == "/")
{
return true; //stack_opera 为 * / 的时候优先级一定是大于等于opera的
}
else // 栈顶那么为+ 或 -
{
//除非opera此时是* / 否则优先级一定小于等于stack_opera
if (opera == "*" || opera == "/")
return false;
else
return true;
}
}
//中缀表达式转后缀表达式
vector<string> InfixToSuffix(vector<string> inffix)
{
vector<string> suffix;
stack<string> s;
string temp;
for(string suf: inffix)
{
if (suf >="0" && suf<="9")
{
suffix.push_back(suf); // 数字直接加入suffix
}
else
{
// 栈不为需要判断优先级来决定是否需要将栈顶元素出栈
if (suf == ")")
{
// 碰到")" 一直出栈,直到"("。
while (!s.empty() && s.top() != "(")
{
suffix.push_back(s.top());
s.pop();
}
s.pop(); //此时左括号也需要出栈
continue; //如果是碰到右括号一直出栈到左括号就ok下面不用执行。
}
//不是右括号,运算符需要入栈,则需要判断优先级
while (!s.empty() && priority(s.top(), suf) )
{
//true说明栈顶的优先级大于等于suf,需要出栈
suffix.push_back(s.top());
s.pop(); // 继续判断下一个栈顶元素
}
//while循环后,说明此时的suf的优先级的大于栈顶元素的,此时入栈
s.push(suf);
}
}
while (!s.empty())
{
suffix.push_back(s.top());
s.pop();
}
return suffix;
}
测试使用的main函数可以这么写:
2+(4+6)/2 + 6/3 (中缀)
\ 2 4 6 + 2 / + 6 3 / + (后缀)
int main()
{
//vector<string> v = { "(","1","+","2",")","*","(","3","+","4",")"};
vector<string> v = { "2","+","(","4","+","6",")","/","2",
"+","6","/","3" };
vector<string> v1 = InfixToSuffix(v);
for (string val : v1)
{
cout << val<< " ";
}
}