任务描述
利用栈实现中缀表达式的求值。 说明: (1)表达式中所有的操作数为单一的数字:0~9; (2)运算符仅包含:+ - * ( ),其中“-”仅为减号,非负号; (3)表达式符号串的长度不超过100。
相关知识
中缀表达求值可分为两步:。 (1)把中缀表达式转换为后缀表达式; (2)根据后缀表达式进行求值
编程要求
可利用第3关和第4关成果,补充完成右边代码,完成本关挑战。 读取中缀表达式,并基于栈的插入、删除等基本操作实现中缀表达式转化为后缀表达式。
输入输出说明
输入有多组测试用例,每一组测试用例占一行,每一组测试用例为仅包含+-*/
等运算法和0~9的运算数,以及()的简单算式中缀表达式,表达式的长度不超过100个字符。输出为该表达式的计算结果,每个输出占一行
测试输入: 1+((2+3)*4)
1+((2+3)*4)-5
预期输出: 21 16
输入格式:中缀表达式 输出格式:中缀表示的结果
#include<iostream> #include<stack> #include<cstring> using namespace std; const int Maxsize = 100; int z=0; char postexp[100]; int cals(string s);//计算后缀表达式A的值 int cal(string s);//计算表达式 x operator y的值 int get_priority(char ch);//获取命题联接词的运算优先级 void exp_postexp(string s);//把中缀式A转换为后缀式R int main() { char inexp[Maxsize] = "";//中缀式 char postexp[Maxsize] = "";//后缀式 int result; while (cin >> inexp)//循环输入测试用例 { // 待补充代码 exp_postexp(inexp); cout<<cals(inexp); } } bool cmp(char a,char b){ if(a=='*'||a=='/'){ if(b=='*'||b=='/'){ return false; } return true; } return false; } int get_priority(char ch)//计算表达式的值 { // 待补充代码 } void exp_postexp(string s)//把中缀式A转换为后缀式R { // 待补充代码 stack<char>op; int len=s.length(); for(int i=0;i<len;i++){ char t=s[i]; if(t=='('){ op.push(t); }else if(t==')'){ char ope=op.top(); while(ope!='('){ postexp[z++]=ope; op.pop(); ope=op.top(); } op.pop(); }else if(t>='0'&&t<='9'){ postexp[z++]=t; }else{ if(op.empty()){ op.push(t); }else{ char stp=op.top(); if(stp=='('||cmp(t,stp))op.push(t); else{ while(!cmp(t,stp)&&!op.empty()&&stp!='('){ op.pop(); postexp[z++]=stp; if(!op.empty())stp=op.top(); } op.push(t); } } } } while(!op.empty()){ char t=op.top(); postexp[z++]=t; op.pop(); } } int cals(string s) //计算表达式的值 { // 待补充代码 stack<float>val; val.push(1.0*(postexp[0]-'0')); for(int i=1;i<z;i++){ char t=postexp[i]; if(t>='0'&&t<='9')val.push((t-'0')*1.0); else{ float x=val.top();val.pop(); float y=val.top();val.pop(); float tmp; if(t=='+')tmp=x+y; if(t=='-')tmp=y-x; if(t=='*')tmp=y*x; if(t=='/')tmp=y/x; val.push(tmp); } } return val.top(); } int cal(int x, int y, char op)//计算表达式 x operator y的值,例3+4 返回7 { // 待补充代码 }