逆波兰表达式的计算问题
2016-04-04 10:28
471 查看
逆波兰表达式分两步,首先要把中缀表达式转换成后缀表达式,然后根据后缀表达式求值。
#include <stdio.h> #include <stack> #include <stdlib.h> #include <string>
using namespace std; //这个是相应的函数声明 char* MidExpressionToLastExpression(char * szExpression); int GetAnswerByLastExpression(char* szExpression); int gLength=0;//统计输入的数字字符个数(包括我们人为添加的\0)
int main() { printf("请输入一个中缀表达式"); char* szExpression=new char; scanf("%s",szExpression); char* pszTmp=MidExpressionToLastExpression(szExpression); int result=GetAnswerByLastExpression(pszTmp); printf("计算结果为%d",result); system("pause"); }
//中缀表达式转换为后缀表达式 char* MidExpressionToLastExpression(char * szExpression) { stack<char>szStack;//这个栈用作中间栈的作用,用于存放临时的运算符及数字 stack<char>szResult;//这个栈是最终结果栈 char* tmp=szExpression; int nlength=strlen(szExpression); gLength=nlength; //处理一个单位数的运算 for (int i=0;i<nlength;i++) { char chtop='<'; if(szStack.size()) { chtop=szStack.top(); }else{ if(*(szExpression+i)-'0'<=9&&*(szExpression+i)-'0'>=0) { }else{ szStack.push(*(szExpression+i)); chtop=szStack.top(); i++; } } if(*(szExpression+i)-'0'<=9&&*(szExpression+i)-'0'>=0) { int j=i+1; szResult.push(*(szExpression+i)); while(*(szExpression+j)-'0'<=9&&*(szExpression+j)-'0'>=0) { szResult.push(*(szExpression+j)); i=j; j++; } szResult.push('\0');//这里加\0是便于后面的计算,这样计算就不仅仅是个位数字的计算 gLength++; }else{ if(chtop=='+'||chtop=='-'||chtop=='(') { if(*(szExpression+i)=='*'||*(szExpression+i)=='/'||*(szExpression+i)=='(') { //当前优先级小于要入栈的元素,则入栈 szStack.push(*(szExpression+i)); }else if(*(szExpression+i)=='+'||*(szExpression+i)=='-') { szStack.push(*(szExpression+i)); }else if(*(szExpression+i)==')') { char tmptop=szStack.top(); while(tmptop!='(') { szResult.push(tmptop); szResult.push('\0'); //这里加\0是便于后面的计算,这样计算就不仅仅是个位数字的计算 gLength++; szStack.pop(); tmptop=szStack.top(); } szStack.pop(); } }else{ if(*(szExpression+i)=='(') { szStack.push(*(szExpression+i)); }else{ char tmptop=szStack.top(); szResult.push(tmptop); szResult.push('\0');//这里加\0是便于后面的计算,这样计算就不仅仅是个位数字的计算 gLength++; szStack.pop(); while(szStack.size()) { szResult.push(szStack.top()); szResult.push('\0');//这里加\0是便于后面的计算,这样计算就不仅仅是个位数字的计算 gLength++; szStack.pop(); } szStack.push(*(szExpression+i)); } } } } //最后将临时栈的运算符输出 while(szStack.size()) { szResult.push(szStack.top()); szResult.push('\0'); szStack.pop(); } int nlen=szResult.size(); char *presult=new char< ab97 /span>[nlen]; while(szResult.size()) { *(presult+nlen-1)=szResult.top(); szResult.pop(); nlen--; } return presult; }
//根据后缀表达式求值 int GetAnswerByLastExpression(char* szExpression) { string strNum=szExpression; int tmplength=0; stack<int>stNum; int resultNum=0; while(tmplength<gLength) { if(strNum=="*"||strNum=="-"||strNum=="/"||strNum=="+") { tmplength+=strNum.length()+1; int num2=stNum.top(); stNum.pop(); int num1=stNum.top(); stNum.pop(); if(strNum=="*") { resultNum=num2*num1; }else if(strNum=="/") { resultNum=num1/num2; }else if(strNum=="+") { resultNum=num1+num2; }else if(strNum=="-"){ resultNum=num1-num2; } stNum.push(resultNum); szExpression+=strNum.length()+1; }else{ tmplength+=strNum.length()+1; stNum.push(atoi(strNum.c_str())); szExpression+=strNum.length()+1; } strNum=szExpression; } return resultNum; }`
相关文章推荐
- c++ 版的蛇形矩阵,正方形的,从数字1开始逐渐增大,呈回字形
- VS2005配置CPPUnit进行单元測试
- C++第2次实验作业
- 标准C++中的string类的用法总结
- C++常用特性原理解析
- 逆向随笔 - strcat函数的实现和分析
- 自动化编译C/C++程序脚本
- 【C++ Primer plus】【第十一章】使用类
- c语言进行数据的多输入多输出
- c++显式加载dll并使用DLL的类
- 基于DEV的命令行调试
- C++中关于new及内存地址的思考
- c语言实现简单的文本文件加密 ---初试
- C++ dll的隐式与显式调用
- 在C++中调用DLL中的函数
- 调查:Java程序员最伤心,C++程序员最年老
- C++浓缩(六)
- C中scanf()返回值问题
- 如何在win8/8.1上安装Visual C++ 6.0
- c语言中二维数组的思考