shunting_yard
update@2011-12-20
/**
*自己定义操作符的优先级
*/
int priorityLevle(const char x){
switch(x){}
}
/**
*自己定义操作符的结合性,左或者右
*/
int rightAssociative(const char x){
switch(x){
case '^':{ return 1;}
}
return 0;
}
/**
*shunting_yard: infix expression to RPN
*中缀转换成后缀
*传入中缀表达式expression,RPN保存在result中
*/
void shunting_yard(char *result,const char *expression){
stack<char> my;
int len = strlen(expression), r = 0;
for(int i = 0;i < len;i++){
if(expression[i] == ' ') continue;
if(expression[i] >= '0' && expression[i] <= '9'){
//是数字直接加到输出队列
result[r++] = expression[i];
}
else{//操作符或者括号
///以下代码需要根据具体情况修改
///需要注意操作符的优先级和结合性
if(r != 0 && result[r-1] != ' ') result[r++] = ' ';//数字之间必须要用空格隔开
if(expression[i] == ')'){
while(!my.empty() && my.top() != '('){
//遇到右括号的时候 要将括号里边的表达式看成一个整体
//将左括号之后的内容都弹出
result[r++] = my.top(); my.pop();
}
if(!my.empty()) my.pop();//弹出左括号
}
else{
while(expression[i] != '('//左括号直接入栈
&&!my.empty()//栈为空的时候也直接入栈
///如果是操作符 需要弹出栈里优先级比它高 或者 优先级相等但是是左结合的操作符
&& my.top() != '('//遇到左括号相当于栈为空
&& (
(priorityLevle(my.top()) > priorityLevle(expression[i]))
||(priorityLevle(my.top()) ==priorityLevle(expression[i]) && !rightAssociative(my.top()))
)
){
result[r++] = my.top(); my.pop();
}
my.push(expression[i]);//将这个操作符入栈
}
}
}
while(!my.empty()){
result[r++] = my.top(); my.pop();
}
result[r] = '\0';
}
shunting_yard,将中缀表达式转换成后缀表达式,写来当模板用。