逆波兰表达式的实现(也叫后缀表达式)
本文主要偏重实现如何将字符串表达式转换为逆波兰表达式。
关于其讲解参考我转载的一篇博文: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!='\0') 44 { 45 if(*Str>='0'&&*Str<='9') 46 { 47 N.push(*Str); 48 Str++; 49 } 50 else 51 { 52 if(*Str=='('||OP.empty()) 53 { 54 OP.push(*Str++); 55 } 56 else 57 { 58 if(*Str==')') 59 { 60 while(!OP.empty()) 61 { 62 //cout<<"OP.top="<<OP.top()<<endl; 63 if(OP.top()!='(') 64 { 65 N.push(OP.top()); 66 } 67 OP.pop(); 68 if(OP.top()=='(') 69 { 70 OP.pop(); 71 break; 72 } 73 } 74 Str++; 75 } 76 else 77 { 78 while(!OP.empty()&&operateprior(*Str)<operateprior(OP.top())) 79 { 80 N.push(OP.top()); 81 OP.pop(); 82 } 83 OP.push(*Str++); 84 } 85 } 86 } 87 88 89 90 } 91 92 while(!OP.empty()) 93 { 94 N.push(OP.top()); 95 OP.pop(); 96 } 97 98 cout<<"The Trans string size="<<N.size()<<endl; 99 char* TransStr; 100 TransStr=new char[N.size()+1]; 101 memset(TransStr,'\0',N.size()+1); 102 int i=N.size()-1; 103 while(!N.empty()) 104 { 105 TransStr[i]=N.top(); 106 N.pop(); 107 i--; 108 } 109 return TransStr; 110 } 111 112 113 114 void main() 115 { 116 char str[50]={'\0'}; 117 char *AfterStr; 118 cout<<"Please input the operate string: "; 119 cin>>str; 120 AfterStr=NiBoLanFun(str); 121 cout<<"The Trans String is: "<<AfterStr<<endl; 122 return; 123 }
运行截图:
其实逆波兰表达式的转换并不难,只是过程冗杂,条件判断较多。
OK,就到这里吧
作者:vpoet
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。