中缀表达式的值
来源:互联网 发布:win10平板软件下载 编辑:程序博客网 时间:2024/06/05 07:59
中缀表达式的值
- 查看
- 提交
- 统计
- 提问
- 总时间限制:
- 200ms
- 内存限制:
- 1024kB
- 描述
- 人们熟悉的四则运算表达式称为中缀表达式,例如(23+34*45/(5+6+7))。在程序设计语言中,可以利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到表达式的值。
给定一个中缀表达式,编写程序,利用堆栈的方法,计算表达式的值。 - 输入
- 第一行为测试数据的组数N
接下来的N行,每行是一个中缀表达式。表达式中只含数字、四则运算符和圆括号,操作数都是正整数,数和运算符、括号之间没有空格。中缀表达式的字符串长度不超过600。 - 输出
- 对每一组测试数据输出一行,为表达式的值
- 样例输入
33+5*8(3+5)*8(23+34*45/(5+6+7))
- 样例输出
4364108
- 提示
- 注意:运算过程均为整数运算(除法运算'/'即按照C++定义的int除以int的结果,测试数据不会出现除数为0的情况),输出结果也为整数(可能为负)。
中间计算结果可能为负。 解题报告
转换的步骤:
1、先给运算符包括(,),+,-,*,/设定优先级
(,)--->不设优先级也可.
+,- 优先级为 2
*,/优先级为 3
2、定义一个保存运算符的栈,栈中元素按优先级高低排列,高优先级在上.为方便操作,定义一个
优先级最低的符号#存于栈底.
3、从左向右的扫描给定的表达式。
1)如果当前字符为 0-9的数字,则将其添加到结果(后缀表达式)串中。
2)如果当前字符为(,则直接将其压入运算符栈中.
3)如果当前字符为 ),则弹出运算符栈中所有的运算符添加到接过串中,直到遇到闭括号 )为止。
4)如果当前我字符为 +,-,*,/中的任何一个,(1)、如果当前字符的优先级高于栈顶运算符的优先级,则直接
将其压入栈中。(2)、如果当前字符的优先级小于等于栈顶运算符的优先级,则将栈中所有优先级大于等于
当前运算符的运算符弹栈,并添加到结果串中,然后将当前运算符压入栈中.
5)重复 1)--- 4),扫描完整个表达式。
6)如果已扫描完表达式,则将栈中余下的运算符都出栈,并且添加到结果串中。处理完毕.
#include <iostream>#include<stack>#include<string>using namespace std;stack <char> p;stack <int> q;string s;void add(){ int a=0,b=0; char c; c=p.top(); p.pop(); a=q.top(); q.pop(); b=q.top(); q.pop(); if(c=='+') { a=b+a; q.push(a); } else if(c=='-') { a=b-a; q.push(a); } else if(c=='*') { a=a*b; q.push(a); } else if(c=='/') { a=b/a; q.push(a); }}int main(){ int n,i,len,m; cin>>n; while(n--) { cin>>s; len=s.length(); for(i=0;i<len;i++) { if(s[i]<48&&s[i]!=')') { if(s[i]=='('||p.empty()) { p.push(s[i]); } else { if(s[i]=='*'||s[i]=='/') { if(p.top()=='+'||p.top()=='-'||p.top()=='(') p.push(s[i]); else { if(!p.empty()) { while(p.top()!='+'||p.top()!='-'||p.top()!='(') { add(); if(p.empty()) break; else if(p.top()=='+'||p.top()=='-'||p.top()=='(') break; } p.push(s[i]); } } } else if(s[i]=='+'||s[i]=='-') { if(p.top()=='(') { p.push(s[i]); } else { if(!p.empty()) { while(p.top()!='('||!p.empty()) { add(); if(p.empty()) break; else if(p.top()=='(') break; } p.push(s[i]); } } } } } else if(s[i]==')') { while(p.top()!='(') { add(); if(p.top()=='(') break; } p.pop(); } else { m=0; while((s[i]>=48&&s[i]<=57)) { m=m*10+s[i]-'0'; i++; } q.push(m); i--; } } while(!p.empty()) { add(); } cout<<q.top()<<endl; } return 0;}
- 中缀表达式的值
- 中缀表达式的值
- 中缀表达式的值
- 求中缀表达式的值
- 计算中缀表达式的值
- POJ 中缀表达式的值
- poj 中缀表达式的值
- 4:中缀表达式的值
- 计算中缀表达式的值
- 【Openjudge】中缀表达式的值
- 计算中缀表达式字符串的值
- 2-4:中缀表达式的值
- [栈]求中缀表达式的值
- OpenJudge题目解析-中缀表达式的值
- 中缀表达式的转换
- 中缀表达式的转换
- 中缀表达式转后缀表达式_求表达式的值
- 直接利用中缀表达式求算术表达式的值(C#)
- PHP中 接收命令行参数(转)
- 模拟键盘API函数Keybd_event用法
- 续:一种让数值在指定范围内由小到大再变小的生成方法(固定时间内)
- 凯撒密码算法
- C# 计算机
- 中缀表达式的值
- FreeImage+openGL
- 湖南省赛2010
- 乘法密码加密算法
- 博客牛人
- hdu_3605 Escape 二分图的多重匹配 匈牙利算法
- Windows Server 2012 R2超级虚拟化之五 利用Shared VHDX创建虚拟机群集
- Java 中类加载的方式
- 张孝祥整理Java面试题