#include <stdio.h>
#include "../SqStack.h"
/*
双目四则运算符:
+ - * / (部分)
*/
bool IsOperator(char ch){
return ch == '+' || ch == '-' || ch == '*' || ch == '/' ? true : false;
}
int OprPrior(char o1, char o2){
/*
返回-1 表示左边操作符优先级高
返回0 表示同优先级
返回1 表示右边操作符优先级高
返回-2 表示o1 或 o2 非操作符
*/
if(!IsOperator(o1) || !IsOperator(o2)) return -2;
if(o1 == '+' && o2 == '*'){
return 1;
}else if(o1 == '+' && o2 == '/'){
return 1;
}else if(o1 == '-' && o2 == '*'){
return 1;
}else if(o1 == '-' && o2 == '/'){
return 1;
}else if(o2 == '+' && o1 == '*'){
return -1;
}else if(o2 == '+' && o1 == '/'){
return -1;
}else if(o2 == '-' && o1 == '*'){
return -1;
}else if(o2 == '-' && o1 == '/'){
return -1;
}else{
return 0;
}
}
void ReversedPrint(SqStack S){
SqStack P;
InitStack(P);
SElemType ch;
while(!StackEmpty(S)){
Pop(S, ch);
Push(P, ch);
}
while(!StackEmpty(P)){
Pop(P, ch);
printf("%c", ch);
}
printf("\n");
}
void ToPost(char pre[]){
SqStack oper, num;
InitStack(oper);
InitStack(num);
int i = 0;
int j = 0;
char ch;
while(pre[i]){
if(IsOperator(pre[i])){
/*
压符号入栈的时候要判断,如果将入栈符号优先级低于栈顶符号,
则要将符号栈元素全部出栈压至num栈,然后才将将入栈符号压入符号栈。
*/
GetTop(oper, ch);
if(OprPrior(pre[i], ch) == 1){
while(!StackEmpty(oper)){
Pop(oper, ch);
Push(num, ch);
}
Push(oper, pre[i]);
}else{
Push(oper, pre[i]);
}
}else{
Push(num, pre[i]);
}
i++;
}
while(!StackEmpty(oper)){
Pop(oper, ch);
Push(num, ch);
}
ReversedPrint(num);
}
int main(){
char exp[] = "A*B+C/D";
ToPost(exp);
return 0;
}
简单的中缀表达式转换为逆波兰表达式
最新推荐文章于 2023-09-07 20:31:28 发布