原理:
1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束,
2.如果是符号,放进栈,
3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式
4.计算后缀表达式,判断是数字还是符号。直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“ ”
代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <iostream> 4 using namespace std; 5 #define MaxOp 100 6 #define MaxSize 100 7 struct //设定运算符优先级 8 { 9 char ch; //运算符 10 int pri; //优先级 11 } 12 lpri[]= {{'=',0},{'(',1},{'*',5},{'/',5},{'%',5},{'+',3},{'-',3},{')',6}}, 13 rpri[]= {{'=',0},{'(',6},{'*',4},{'/',4},{'%',4},{'+',2},{'-',2},{')',1}}; 14 int leftpri(char op) //求左运算符op的优先级 15 { 16 int i; 17 for (i=0; i<MaxOp; i++) 18 if (lpri[i].ch==op) 19 return lpri[i].pri; 20 } 21 int rightpri(char op) //求右运算符op的优先级 22 { 23 int i; 24 for (i=0; i<MaxOp; i++) 25 if (rpri[i].ch==op) 26 return rpri[i].pri; 27 } 28 bool InOp(char ch) //判断ch是否为运算符 29 { 30 if (ch=='(' || ch==')' || ch=='+' || ch=='-' 31 || ch=='*' || ch=='/'||ch=='%') 32 return true; 33 else 34 return false; 35 } 36 int Precede(char op1,char op2) //op1和op2运算符优先级的比较结果 37 { 38 if (leftpri(op1)==rightpri(op2)) 39 return 0; 40 else if (leftpri(op1)<rightpri(op2)) 41 return -1; 42 else 43 return 1; 44 } 45 void trans(char *exp,char postexp[]) 46 //将算术表达式exp转换成后缀表达式postexp 47 { 48 struct 49 { 50 char data[MaxSize]; //存放运算符 51 int top; //栈指针 52 } op; //定义运算符栈 53 int i=0; //i作为postexp的下标 54 op.top=-1; 55 op.top++; //将'='进栈 56 op.data[op.top]='='; 57 while (*exp!='