#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<stack>
#include<cmath>
using namespace std;
char opter[1000]={0};//储存操作符
int opval[1000]={0};//储存操作数
int PointOpter=-1,PointOpval=-1;
char read[20]={0};
char compare[][8]=
{ //栈顶操作符
//新读取操作符,比较关系为新读取操作符__栈顶操作符
{'<','<','<','<','>','x','<','>'},
{'<','<','<','<','>','x','<','>'},
{'>','>','<','<','>','x','<','>'},
{'>','>','<','<','>','x','<','>'},
{'>','>','>','>','>','x','>','>'},
{'<','<','<','<','=','x','<','x'},
{'>','>','>','>','>','x','<','>'},
{'<','<','<','<','x','<','<','='}
};
int Index(char ch)
{
if(ch=='+')
return 0;
if(ch=='-')
return 1;
if(ch=='*')
return 2;
if(ch=='/')
return 3;
if(ch=='(')
return 4;
if(ch==')')
return 5;
if(ch=='^')
return 6;
if(ch=='#')
return 7;
}
char Compare(char New,char top)
{
int index1=Index(New);
int index2=Index(top);
return compare[index1][index2];
}
int Calculate(char ch,int v1,int v2)//v2位于栈顶,v1位于栈顶下一个
{
if(ch=='+')
return v1+v2;
if(ch=='-')
return v1-v2;
if(ch=='*')
return v1*v2;
if(ch=='/')
return v1/v2;
if(ch=='^')
return (int)(pow(v1,v2));
}
int GetValue()
{
int num,End = 0;//End标记读完;
opter[++PointOpter] = '#';
char c;
scanf("%s",read);
while(PointOpter!=-1)
{
if(End)
c = '#';
if((strlen(read)==1&&!(read[0]>='0'&&read[0]<='9'))||End) //字符是操作符
{
if(!End)
c = read[0];
char c1,c2;
int v1,v2;
c1 = Compare(c,opter[PointOpter]);
if(c1=='>')
{
opter[++PointOpter] = c;
c= getchar();
if(c=='\n')
End = 1;
else
{
memset(read,'\0',sizeof(read));
scanf("%s",read);
}
}
else if(c1=='<')
{
c2=opter[PointOpter];
PointOpter--;
v2=opval[PointOpval];
PointOpval--;
v1=opval[PointOpval];
PointOpval--;
opval[++PointOpval] = Calculate(c2,v1,v2);
}
else if(c1=='=')
{
PointOpter--;
if(c=='#')
break;
c= getchar();
if(c=='\n')
End = 1;
else
{
memset(read,'\0',sizeof(read));
scanf("%s",read);
}
}
else
{
cout<<"输入有误"<<endl;
exit(0);
}
}
else
{
num = 0;
int Minus = 0,i=0;//Minus标记读到负号,i标记读到哪个数
c=read[0];
if(read[0]=='-')
Minus = 1,c=read[++i];
while(i<(strlen(read)))
{
num = 10*num+(c-'0');
c = read[++i];
}
if(Minus)
{ num = -num,Minus = 0; }
opval[++PointOpval] = num;
c= getchar();
if(c=='\n')
End = 1;
else
{
memset(read,'\0',sizeof(read));
scanf("%s",read);
}
}
}
return opval[0];
}
int main(void)
{
int n;
scanf("%d",&n);
getchar();//读入换行符
while(n--)
{
printf("%d\n",GetValue());
PointOpval--;//将栈顶元素弹出
}
return 0;
}
用栈实现对表达式的求值,通过了样例但是提交到OpenJudge上时RE了,求助大神帮忙指出并修正错误,
题主发一下题目链接吧
啊抱歉忘了 http://hxsjjg.openjudge.cn/2021hw2/3/
opter和opval数组开小了,产生了数组越界