这段代码对一些读入的非法数据判断存在错误
比如像出现 a++b 就无法判断了
另外需要注意的是我觉得栈里面存储的是char型的,但是在操作数值的时候,会很不方便
还有一点在主函数里面如果想用while来多次读入数据的话,那么你要考虑上一次输入数据失败后,那后面的字符该怎么操作
上面出现的问题大家可以尝试着去解决
以下是根据书上的代码简单敲出来的
bool In(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return true;
return false;
}
char Precede(char t1,char t2)
{
char f = '>';
if(t2 == '+'||t2 == '-')
{
if(t1 == '('||t1 == '#') f = '<';
// if(t1 == '+'||t1 == '-'||t1 == '*'||t1 == '/')
//这种情况是后面测试数据中如果出现两个x++y时补上的,可是发现如果是x+y+z形式也符合,so这个问题还没解决
// {
// FLAG = 0;return 'k';
// }
}
if(t2 == '*'||t2 == '/')
{
if(t1 == '+'||t1 =='-'||t1 == '('||t1 == '#')
f = '<';
}
if(t2 == '(')
if(t1 ==')')
{
FLAG=0;return 'k';
}
else
f = '<';
if(t2 == ')')
{
if(t1 == '(') f = '=';
if(t1 == '#') {FLAG=0;return 'K';}
}
if(t2 == '#')
{
if(t1 == '(') {FLAG=0;return 'K';}
if(t1 == '#') f = '=';
}
return f;
}
char Operate(char a,char c,char b)
{
//这里稍微调试了一下,主要是码值int和char之间的转换
a = a-48;
b = b-48;
//cout<<((char)a+b);
//cout<<a<<" "<<b<<endl;
if(c == '+') return (char)(a+b+48);
if(c == '-') return (char)(a-b+48);
if(c == '*') return (char)(a*b+48);
if(c == '/') return (char)(a/b+48);
}
void shixian()
{
char ch,k,a,b,h; //ch是读入数据,k是运算符,ab是数值,h无实际作用
//int a,b,h;
Stack OPTR,OPND;
Init_stack(OPTR);Push(OPTR,'#');
Init_stack(OPND);cin>>ch;
while(ch!='#'||Gettop(OPTR)!='#')
{
if(FLAG==0) {printf("Wrong!");break;}
//提前结束
if(!In(ch))
{
Push(OPND,ch);
cin>>ch;
//Out_stack(OPND);
//Out_stack(OPTR);
}
else
{
switch(Precede(Gettop(OPTR),ch))
{
case'>':
Pop(OPTR,k);
Pop(OPND,a); Pop(OPND,b);
Push(OPND,Operate(b,k,a));
//Out_stack(OPND);
//cout<<ch;
//cout<<b-48<<" "<<a-48<<endl;
break;
case'<':
Push(OPTR,ch);
cin>>ch;
break;
case'=':
Pop(OPTR,h);
cin>>ch;
break;
default:break;
}
}
}
if(FLAG == 1)
cout<<Gettop(OPND)-48<<endl;
else
cout<<"读入数据有错!\n";
}