本文主要偏重实现如何将字符串表达式转换为逆波兰表达式。
关于其讲解参考我转载的一篇博文:http://www.cnblogs.com/vpoet/p/4659546.html
先说说优先级:
() +- */%(从左到右递增)
下面先简单再梳理一下:
1.建立两个栈,一个为N(数据栈),一个为OP(运算符栈)
2.将字符串从左向右遍历,把数据压入数据栈,把运算符压入运算符的栈
关于运算符压栈的规则:⑴ 如果OP为空或者为待压栈操作符为左括号则直接将运算符压入栈
⑵ 如果待压栈操作符的优先级大于栈顶操作符则直接入栈
⑶ 如果栈顶操作符的优先级大于待压栈操作符,则将OP栈顶的操作符依次压入N知道
遇到左括号或者OP为空则停止,此时压入该操作符到OP栈顶中
⑷ 如果遇到右括号则将OP栈中的元素依次弹出压入N中直到遇到左括号为止,同时弹
出左括号并且右括号不压入OP
⑸ 最后将OP中的元素依次弹出并压入N中,将N弹出并逆序输出则是最终的逆波兰表达式
代码实现如下:
1 #include <iostream> 2 #include <stack> 3 using namespace std; 4 5 6 int operateprior(char a1) 7 { 8 int prior; 9 10 switch(a1) 11 { 12 case '(': 13 prior=0; 14 break; 15 case ')': 16 prior=0; 17 break; 18 case '+': 19 prior=1; 20 break; 21 case '-': 22 prior=1; 23 break; 24 case '*': 25 prior=2; 26 break; 27 case '/': 28 prior=2; 29 break; 30 case '%': 31 prior=2; 32 break; 33 } 34 return prior; 35 } 36 37 38 char* NiBoLanFun(char* Str) 39 { 40 stack<char> N; 41 stack<char> OP; 42 43 while(*Str!='