算法:
·开始扫描;
·数字时,加入后缀表达式;
·运算符:
a. 若为最高级的运算符,入栈;
b. 若为 '(',入栈;
c. 若为 ')',则依次把栈中的的运算符加入后缀表达式中,直到出现'(',从栈中删除'(' ;
d. 若为不是最高级的运算符,则将从栈顶到第一个优先级不大于(小于,低于或等于)它的运算符(或 '(')之间的运算符加入后缀表达式中,该运算符再入栈;
O(∩_∩)O哈哈~,大家一起交流哈~~
优秀的程序员要解释代码。
我对本人的代码还是挺自信的。。。
其他函数很简单,都是工具函数不解释。
主要看的是那个InfixToSubbfix();函数,该函数,对照楼上的算法就能很容易理解了。
我的结构还是很清晰的。
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
bool isHigh(char top_op,char Infix_op); // 判断优先级,这个函数我写不好,太冗余了,不知大家怎么写?
bool isOperator(char Infix_op);//判断是不是operator
bool input(vector<char> *infix);//输入中缀表达式,以‘$’结束
void output(vector<char> *suffix);//输入后缀表达式
void InfixToSuffix(vector<char>*infix,vector<char> *suffix,stack<char> *tempStack);//该函数实现转换
int main()
{
stack<char> tempStack;
vector<char> infix;
vector<char> suffix;
while(input(&infix))
{
InfixToSuffix(&infix,&suffix,&tempStack);
output(&suffix);
infix.clear();
suffix.clear();
}
return 0;
}
bool isHigh(char top_op,char Infix_op)
{
if(Infix_op=='+'&&top_op=='+') return true;
if(Infix_op=='+'&&top_op=='-') return true;
if(Infix_op=='-'&&top_op=='+') return true;
if(Infix_op=='-'&&top_op=='-') return true;
if(Infix_op=='*'&&top_op=='*') return true;
if(Infix_op=='*'&&top_op=='/') return true;
if(Infix_op=='/'&&top_op=='*') return true;
if(Infix_op=='/'&&top_op=='/') return true;
if(Infix_op=='/'&&top_op=='+') return true;
if(Infix_op=='/'&&top_op=='-') return true;
if(Infix_op=='*'&&top_op=='+') return true;
if(Infix_op=='*'&&top_op=='-') return true;
if(Infix_op=='('&&top_op=='+') return true;
if(Infix_op=='('&&top_op=='-') return true;
if(Infix_op=='('&&top_op=='*') return true;
if(Infix_op=='('&&top_op=='/') return true;
return false;
}
bool isOperator(char Infix_op)
{
if(Infix_op=='+'||Infix_op=='-'||Infix_op=='/'||Infix_op=='*'
||Infix_op=='('||Infix_op==')')
return true;
return false;
}
bool input(vector<char> *infix)
{
char c;
cin>>c;
while(c!='$')
{
if(c!=' ')
infix->push_back(c);
cin>>c;
}
return true;
}
void InfixToSuffix(vector<char>*infix,vector<char> *suffix,stack<char> *tempStack)
{
for(vector<char>::iterator it=infix->begin();it!=infix->end(); ++it )
{
if(!isOperator(*it))
{
suffix->push_back(*it);
}
else
{
if(tempStack->empty())
{
tempStack->push(*it);
}
elseif(isHigh(tempStack->top(),*it)||tempStack->top()=='(')
{
tempStack->push(*it);
}
else if(*it==')')
{
while(tempStack->top()!='('&&!tempStack->empty())
{
suffix->push_back(tempStack->top());
tempStack->pop();
}
tempStack->pop();
}
else if(!isHigh(tempStack->top(),*it))
{
while(!tempStack->empty()&& !isHigh(tempStack->top(),*it) )
{
suffix->push_back(tempStack->top());
tempStack->pop();
}
tempStack->push(*it);
}
}
}
while(!tempStack->empty())
{
suffix->push_back(tempStack->top());
tempStack->pop();
}
}
void output(vector<char> *suffix)
{
for(vector<char>::iterator it=suffix->begin();it!=suffix->end(); ++it )
{
cout<<*it;
}
cout<<endl;
}