表达式求值,具体的思路就是放在栈里面利用中缀表达式转后缀表达式得出最后的结果就可以了,但是这个题的话有些问题,就是可能出现有复数的情况,这里复数出现的情况在开头和(后面,其他地方出现的复数均可按照一般情况计算,所以的话,把这两个地方单独进行判断,如果开头是-号,则进栈,等到第一个数字算出来之后,这个数字乘以-1,把-出栈,如果是(后面的也是一样,先进栈,处理数字,数字处理结束之后,数字乘以-1 ,把-出栈,其余的情况完全按照要求去做就可以了。中间有队列溢出的情况,已经改掉,但是其实也是因为有复数的情况导致的,复数的时候因为堆栈请不干净会死循环,解决这个问题之后连带堆栈溢出问题也都解决了,过两天这道题可以再去写一遍
#include<iostream>
#include<stack>
#include<string>
#include<cstdio>
using namespace std;
stack<int> num;
stack<char> opt;
char str[1005];
bool isOperator(char ch){
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'){
return true;
}else{
return false;
}
}
int getPriority(char ch){
int level=0;
switch(ch){
case '(':
level=1;
break;
case '+':
case '-':
level=2;
break;
case '*':
case '/':
level=3;
break;
default:
break;
}
return level;
}
void cal(char ch){
//不加会报堆栈错误,刚刚没想到有负数的情况
if(num.size()==1){
return ;
}
int a=num.top();
num.pop();
int b=num.top();
num.pop();
switch(ch){
case '+':
num.push(a+b);
break;
case '-':
num.push(b-a);
break;
case '*':
num.push(a*b);
break;
case '/':
num.push(b/a);
break;
}
}
//flag=0 是运算符 flag=1是符号
int main(){
while(scanf("%s",str)!=EOF){
int i=0,flag=0;
if(str[0]=='-'){
flag=1;
}
while(str[i]!=0){
if(str[i]>='0'&&str[i]<='9'){
int tmp=0;
do{
tmp=tmp*10+str[i]-'0';
i++;
}while(str[i]>='0'&&str[i]<='9');
if(flag==1&&!opt.empty()){
tmp=tmp*-1;
opt.pop();
flag=0;
}
num.push(tmp);
}else if(str[i]=='('){
if(str[i+1]=='-'){
flag=1;
}
opt.push(str[i]);
i++;
}else if(isOperator(str[i])){
if(opt.empty()){
opt.push(str[i]);
i++;
}else{
while(!opt.empty()){
char c=opt.top();
if(getPriority(str[i])<=getPriority(c)){
//计算
cal(c);
opt.pop();
}else{
break;
}
}
opt.push(str[i]);
i++;
}
}else if(str[i]==')'){
while(opt.top()!='('){
char c=opt.top();
opt.pop();
cal(c);
}
opt.pop();
i++;
}else{
i++;
}
}
while(!opt.empty()){
char c=opt.top();
opt.pop();
cal(c);
}
printf("%d\n",num.top());
}
return 0;
} 
京公网安备 11010502036488号