面试题(十五)四则运算表达式
来源:互联网 发布:mac os 10.95官方原版 编辑:程序博客网 时间:2024/05/22 06:30
一个四则运算表达式该如何求值,比如
(2+1)*(2+3)+2*6
这里只考虑+-*/()的形式
先把四则运算符(中缀表达式)转换成后缀表达式,再利用栈对后缀表达式进行处理;
关键是如何将中缀表达式转换成后缀表达式,规则如下:
(1)如果当前字符是数字,直接输出到后缀表达式
(2)如果是‘(’,压栈
(3)如果是‘)’,将栈中从‘(’到栈顶的元素全部退栈,并输出到后缀表达式,栈中的‘(’退栈即可不需要输出到后缀表达式
(4)如果当前元素的优先级小于栈顶元素的优先级,本着优先级越大距离数字越近的原则,将栈顶元素依次退栈,输出到后缀表达式,直到当前元素的优先级大于等于栈顶元素的优先级
(4)其他情况,直接入栈
当所有字符处理完毕后,依次将栈内元素退栈到后缀表达式中
代码如下:
#include<iostream>#include <stack>using namespace std;int priority(char c);bool calculate(char *pStr,int &nRes);void convert(const char *pStrSrc,char *pStrObj);int main(){char *pStr="(2+1)*(2+3)+2*6";char pStrObj[30];memset(pStrObj,0,30);convert(pStr,pStrObj);int nRes;if(calculate(pStrObj,nRes)){cout<<nRes<<endl;}getchar();return 0;}void convert(const char *pStrSrc,char *pStrObj){if (pStrSrc==NULL||pStrObj==NULL){return;}int nLen=strlen(pStrSrc);int objIndex=0;stack<char> StackTemp;for (int i=0;i<nLen;i++){if (pStrSrc[i]<='9'&&pStrSrc[i]>='0'){pStrObj[objIndex++]=pStrSrc[i];}else if (StackTemp.empty()){StackTemp.push(pStrSrc[i]);}else if (pStrSrc[i]=='('){StackTemp.push(pStrSrc[i]);}else if (pStrSrc[i]==')'){while(!StackTemp.empty()&&StackTemp.top()!='('){char cTemp=StackTemp.top();StackTemp.pop();pStrObj[objIndex++]=cTemp;}if (!StackTemp.empty()){StackTemp.pop();}}//优先级越高,离数据越近else if (priority(pStrSrc[i])<priority(StackTemp.top())){while(!StackTemp.empty()&&priority(StackTemp.top())>priority(pStrSrc[i])){pStrObj[objIndex++]=StackTemp.top();StackTemp.pop();}StackTemp.push(pStrSrc[i]);}else{StackTemp.push(pStrSrc[i]);}}while(!StackTemp.empty()){pStrObj[objIndex++]=StackTemp.top();StackTemp.pop();}for (int i=0;i<objIndex;i++){cout<<pStrObj[i];}cout<<endl;}bool calculate(char *pStr,int &nRes){int nLen=strlen(pStr);if (pStr==NULL||nLen==0){return false;}stack<char> ss;ss.push(pStr[0]);for (int i=1;i<nLen;i++){if (pStr[i]<='9'&&pStr[i]>='0'){ss.push(pStr[i]);}else{if (pStr[i]=='+'){int nTemp2=ss.top()-'0';ss.pop();int nTemp1=ss.top()-'0';ss.pop();ss.push(nTemp1+nTemp2+'0');}else if (pStr[i]=='-'){int nTemp2=ss.top()-'0';ss.pop();int nTemp1=ss.top()-'0';ss.pop();ss.push(nTemp1-nTemp2+'0');}else if (pStr[i]=='*'){int nTemp2=ss.top()-'0';ss.pop();int nTemp1=ss.top()-'0';ss.pop();ss.push(nTemp1*nTemp2+'0');}else if (pStr[i]=='/'){int nTemp2=ss.top()-'0';ss.pop();if (nTemp2==0){return false;}int nTemp1=ss.top()-'0';ss.pop();ss.push(nTemp1/nTemp2+'0');}}}nRes=ss.top()-'0';return true;}int priority(char c){if (c=='+'){return 0;}else if(c=='-'){return 0;}else if (c=='*'){return 1;}else if(c=='/'){return 1;}elsereturn -1;}
0 0
- 面试题(十五)四则运算表达式
- 面试题 简单的字符串表达式四则运算(不考虑括号)
- 微软十五道面试题(待续)
- 面试题13之大数的四则运算(续)
- 微软十五道面试题
- 十五道常用面试题
- 面试题45:字符串四则运算的实现
- 华为面试题:四则运算 C语言源码
- 四则运算(表达式求值)
- 正则表达式面试题
- 十五道关于Hibernate的面试题
- 十五道海量数据处理面试题
- 十五道关于Hibernate的面试题
- 微软十五道面试题 答案
- 十五道海量数据处理面试题
- java面试题二十五 构造函数
- Java面试题大全(Java基础十五)
- 算术表达式求值(四则运算)
- STL#2
- spark学习十 yarn环境的搭建以及spark程序测试
- scrapy-redis实现scrapy分布式爬取分析
- 杭电 1018 Big Number
- 架构师资料
- 面试题(十五)四则运算表达式
- C++项目——人数不定的工资类
- printf 的串口输入重定向
- getRequestDispatcher 和sendRedirect区别2
- IBM raid相关操作
- OCP 1Z0 053 194
- 暑期个人赛--第一场--D
- Mysql的varchar(20)到底可以存储多少个中文字符
- 字符串的比较——strcmp