第一种方法的逻辑是我比较理得清的
法一:
midS是存放中缀表达式的字符串,字符之间没有空格,suffiexS是存放后缀表达式的字符串,数字和字符之间都有空格
思路:
1.如果midS[i]是'(',直接压栈
2.如果是数字, 把完整数字复制到到midS中后加一个空格,读取完数字后要判断此时的midS[i]是否是' ',如果是的话,break结束循环
3.如果是')',不停弹栈,把弹栈后的字符存到suffiexS中,加空格,注意要更新ch中所存栈顶元素的值,等遇到栈顶为'('时,停止弹栈,把'('出栈
4.如果栈顶字符优先级小于midS[i]或者栈为空,那么midS[i]直接进栈
5.如果栈顶字符优先级大于等于midS[i],一直弹出栈顶元素到suffiexS中(直到栈顶字符优先级小于midS[i]或者栈为空),每次存字符之后都要加空格,循环中注意更新ch中所存栈顶元素的值,'('的优先级最低,所以无论如何都不会在此比较下被弹出
6.退出循环后,判断栈是否为空,如果不为空的话,一直弹栈,将字符存入后缀表达式的字符串,加空格
1 #include "SqStack.h" 2 #include <cctype> 3 4 double caculate(double a, char ch, double b) 5 { 6 switch (ch) 7 { 8 case '+': return a + b; 9 case '-': return a - b; 10 case '*': return a * b; 11 case '/': return a / b; 12 } 13 return 0; 14 } 15 16 int get_priority(char ch) 17 { 18 int priority = 0; 19 switch (ch) 20 { 21 case '+': 22 case '-': 23 priority = 1; 24 break; 25 case '*': 26 case '/': 27 priority = 2; 28 break; 29 case '(': 30 priority = 0; 31 break; 32 } 33 return priority; 34 } 35 36 /*中缀表达式转后缀表达式*/ 37 void transform(char* suffiexS, char* midS) 38 { 39 int i = 0; 40 int cnt = 0; //作为后缀表达式的字符栈的下标 41 SqStack<char> Stack; 42 char ch; 43 cout << midS << endl; 44 for (i = 0; midS[i] != '