题目描述
模拟计算机处理算术表达式过程,从键盘上输入算术表达式串,表达式只包括'+','-','*','/'四种运算符,数字和括号,其中'-'只表示减号,不表示负数,即表达式里不存在负数,'/'如果不能整除,结果只取商,保证输入的字符串是合法的,求出该表达式的值
输入格式
只有一行为一个表达式,长度小于100
输出
只有一行,为表达式的值
样例输入
(123+321)*(2-3)/5
样例输出
-88
【算法分析】
用两个栈来存储,一个栈存储数,另外一个栈存储运算符,转换完了,再对运算符栈逐一出栈,出一个运算符,就把数值所在的栈的栈顶的两元素进行运算结果存在栈顶(栈顶两元素,一个出栈,另一个更新成运算后的结果)。这里要注意优先性的问题
【代码实现】
#include<bits/stdc++.h>
using namespace std;
int number[101],i=0, p=1;
char symbol[101],s[256], t[256];
void push() //算符入栈运算
{
symbol[++p]=s[i];
}
void pop() //运算符栈顶元素出栈,并取出操作数栈元素完成相应的运算
{
switch (symbol[p--])//注意这里p退了一步,symbol[p];p--;
{
case '+':number[p]+=number[p+1];break;
case '-':number[p]-=number[p+1];break;
case '*':number[p]*=number[p+1];break;
case '/':number[p]/=number[p+1];break;
}
}
bool can() //判断运算符的优先级别,建立标志函数
{
if ((s[i]=='+'||s[i]=='-')&&symbol[p]!='(') return 1;//这里能体现+-*/优先性
if ((s[i]=='*'||s[i]=='/')&&(symbol[p]=='*'||symbol[p]=='/'))return 1;
return 0;
}
main()
{
printf("String :");gets(s);
s[strlen(s)]=')';symbol[p]='(';
while (i<strlen(s))
{
while (s[i]=='(') //左括号处理
{
push();i++;
}
int x=0;
while (s[i]>='0'&&s[i]<='9') //取数入操作数栈
x=x*10+s[i++]-'0';
number[p]=x;
do
{
if (s[i]==')') //右括号处理
{
while (symbol[p]!='(') pop();//这里是此题难点且关键
number[--p]=number[p + 1];
}
else
{//根据标志函数值作运算符入栈或出栈运算处理
while (can()) pop();
push();
}
for(int j=0;j<=i+1;j++)
cout<<number[j]<<" ";
cout<<endl;
for(int j=0;j<=i+1;j++)
cout<<symbol[j]<<" ";
cout<<endl;
i++;
}while(i<strlen(s)&&s[i-1]==')');
}
printf("Result=%d", number[0]);
return 0;
}
















