逆波兰表达式的实现(也叫后缀表达式)
2015-07-24 17:41
295 查看
本文主要偏重实现如何将字符串表达式转换为逆波兰表达式。
关于其讲解参考我转载的一篇博文:http://www.cnblogs.com/vpoet/p/4659546.html
先说说优先级:
() +- */%(从左到右递增)
下面先简单再梳理一下:
1.建立两个栈,一个为N(数据栈),一个为OP(运算符栈)
2.将字符串从左向右遍历,把数据压入数据栈,把运算符压入运算符的栈
关于运算符压栈的规则:⑴ 如果OP为空或者为待压栈操作符为左括号则直接将运算符压入栈
⑵ 如果待压栈操作符的优先级大于栈顶操作符则直接入栈
⑶ 如果栈顶操作符的优先级大于待压栈操作符,则将OP栈顶的操作符依次压入N知道
遇到左括号或者OP为空则停止,此时压入该操作符到OP栈顶中
⑷ 如果遇到右括号则将OP栈中的元素依次弹出压入N中直到遇到左括号为止,同时弹
出左括号并且右括号不压入OP
⑸ 最后将OP中的元素依次弹出并压入N中,将N弹出并逆序输出则是最终的逆波兰表达式
代码实现如下:
运行截图:
其实逆波兰表达式的转换并不难,只是过程冗杂,条件判断较多。
OK,就到这里吧
关于其讲解参考我转载的一篇博文:http://www.cnblogs.com/vpoet/p/4659546.html
先说说优先级:
() +- */%(从左到右递增)
下面先简单再梳理一下:
1.建立两个栈,一个为N(数据栈),一个为OP(运算符栈)
2.将字符串从左向右遍历,把数据压入数据栈,把运算符压入运算符的栈
关于运算符压栈的规则:⑴ 如果OP为空或者为待压栈操作符为左括号则直接将运算符压入栈
⑵ 如果待压栈操作符的优先级大于栈顶操作符则直接入栈
⑶ 如果栈顶操作符的优先级大于待压栈操作符,则将OP栈顶的操作符依次压入N知道
遇到左括号或者OP为空则停止,此时压入该操作符到OP栈顶中
⑷ 如果遇到右括号则将OP栈中的元素依次弹出压入N中直到遇到左括号为止,同时弹
出左括号并且右括号不压入OP
⑸ 最后将OP中的元素依次弹出并压入N中,将N弹出并逆序输出则是最终的逆波兰表达式
代码实现如下:
#include <iostream> #include <stack> using namespace std; int operateprior(char a1) { int prior; switch(a1) { case '(': prior=0; break; case ')': prior=0; break; case '+': prior=1; break; case '-': prior=1; break; case '*': prior=2; break; case '/': prior=2; break; case '%': prior=2; break; } return prior; } char* NiBoLanFun(char* Str) { stack<char> N; stack<char> OP; while(*Str!='\0') { if(*Str>='0'&&*Str<='9') { N.push(*Str); Str++; } else { if(*Str=='('||OP.empty()) { OP.push(*Str++); } else { if(*Str==')') { while(!OP.empty()) { //cout<<"OP.top="<<OP.top()<<endl; if(OP.top()!='(') { N.push(OP.top()); } OP.pop(); if(OP.top()=='(') { OP.pop(); break; } } Str++; } else { while(!OP.empty()&&operateprior(*Str)<operateprior(OP.top())) { N.push(OP.top()); OP.pop(); } OP.push(*Str++); } } } } while(!OP.empty()) { N.push(OP.top()); OP.pop(); } cout<<"The Trans string size="<<N.size()<<endl; char* TransStr; TransStr=new char[N.size()+1]; memset(TransStr,'\0',N.size()+1); int i=N.size()-1; while(!N.empty()) { TransStr[i]=N.top(); N.pop(); i--; } return TransStr; } void main() { char str[50]={'\0'}; char *AfterStr; cout<<"Please input the operate string: "; cin>>str; AfterStr=NiBoLanFun(str); cout<<"The Trans String is: "<<AfterStr<<endl; return; }
运行截图:
其实逆波兰表达式的转换并不难,只是过程冗杂,条件判断较多。
OK,就到这里吧
相关文章推荐
- Android初学习 - color在XML文件和java代码中的定义和使用
- C++ 线程(二)
- C++链表,增删改查
- java多线程(九)线程中断
- 串口参数详解:波特率,数据位,停止位,奇偶校验位
- EasyExplorer插件下载地址
- java中基本类型与装箱基本类型“==”比较出现的几种情况
- mybatis——延迟加载
- mybatis——延迟加载
- C/C++ 文件操作
- PHP的parse_ini_file()函数,解释结构类型php.ini格式的文件
- Util map与Bean互转
- MMORPG服务器架构
- C++中调用Python脚本
- [网络流24题] 02 太空飞行计划(最大权闭合图, 最大流)
- org.eclipse.jdt.internal.compiler.CompilationResult.getProblems()[Lorg/eclipse/jdt/core/comp
- Git错误整理
- fatal error C1033: 无法打开程序数据库
- 【算法与数据结构】直接插入排序算法
- Online Judge System For SzNOI 题库 语法百题 c++ d030