资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
#include<iostream>
#include <stdlib.h>
#include<stack>
using namespace std;
void trans(char *exp,char postexp[]) //将算术表达式exp转换成后缀表达式postexp
{
char e;
stack<char> Optr; //定义运算符栈
int i=0; //i作为postexp的下标
while (*exp!='\0') //exp表达式未扫描完时循环
{ switch(*exp)
{
case '(': //判定为左括号
Optr.push('('); //左括号进栈
exp++; //继续扫描其他字符
break;
case ')': //判定为右括号
e=Optr.top();
Optr.pop(); //出栈元素e
while (e!='(') //不为'('时循环
{
postexp[i++]=e; //将e存放到postexp中
e=Optr.top();
Optr.pop(); //继续出栈元素e
}
exp++; //继续扫描其他字符
break;
case '+': //判定为加或减号
case '-':
while (!Optr.empty()) //栈不空循环
{
e=Optr.top(); //取栈顶元素e
if (e!='(') //e不是'('
{
postexp[i++]=e; //将e存放到postexp中
e=Optr.top();
Optr.pop(); //出栈元素e
}
else //e是'(时退出循环
break;
}
Optr.push(*exp); //将'+'或'-'进栈
exp++; //继续扫描其他字符
break;
case '*': //判定为'*'或'/'号
case '/':
while (!Optr.empty()) //栈不空循环
{
e=Optr.top(); //取栈顶元素e
if (e=='*' || e=='/') //将栈顶'*'或'/'运算符出栈并存放到postexp中
{
postexp[i++]=e; //将e存放到postexp中
e=Optr.top();
Optr.pop(); //出栈元素e
}
else //e为非'*'或'/'运算符时退出循环
break;
}
Optr.push(*exp); //将'*'或'/'进栈
exp++; //继续扫描其他字符
break;
default: //处理数字字符
while (*exp>='0' && *exp<='9') //判定为数字
{ postexp[i++]=*exp;
exp++;
}
postexp[i++]='#'; //用#标识一个数值串结束
}
}
while (!Optr.empty()) //此时exp扫描完毕,栈不空时循环
{
e=Optr.top();
Optr.pop(); //出栈元素e
postexp[i++]=e; //将e存放到postexp中
}
postexp[i]='\0'; //给postexp表达式添加结束标识
}
int compvalue(char *postexp) //计算后缀表达式的值
{
int d,a,b,c,e;
stack<int> Opnd; //定义操作数栈
while (*postexp!='\0') //postexp字符串未扫描完时循环
{
switch (*postexp)
{
case '+': //判定为'+'号
a=Opnd.top();
Opnd.pop(); //出栈元素a
b=Opnd.top(); //出栈元素b
Opnd.pop();
c=b+a; //计算c
Opnd.push(c); //将计算结果c进栈
break;
case '-': //判定为'-'号
a=Opnd.top();
Opnd.pop(); //出栈元素a
b=Opnd.top();
Opnd.pop(); //出栈元素b
c=b-a; //计算c
Opnd.push(c); //将计算结果c进栈
break;
case '*': //判定为'*'号
a=Opnd.top();
Opnd.pop(); //出栈元素a
b=Opnd.top();
Opnd.pop(); //出栈元素b
c=b*a; //计算c
Opnd.push(c); //将计算结果c进栈
break;
case '/': //判定为'/'号
a=Opnd.top();
Opnd.pop(); //出栈元素a
b=Opnd.top();
Opnd.pop(); //出栈元素b
if (a!=0)
{
c=b/a; //计算c
Opnd.push(c); //将计算结果c进栈
break;
}
else
exit(0); //异常退出
break;
default: //处理数字字符
d=0; //将连续的数字字符转换成对应的数值存放到d中
while (*postexp>='0' && *postexp<='9') //判定为数字字符
{
d=10*d+*postexp-'0';
postexp++;
}
Opnd.push(d); //将数值d进栈
break;
}
postexp++; //继续处理其他字符
}
e=Opnd.top(); //取栈顶元素e
return e; //返回e
}
int main()
{
char exp[100];
char postexp[100];
cin>>exp;
trans(exp,postexp);
cout<<compvalue(postexp)<<endl;
return 0;
}