表达式--栈的实现(数据结构)

来源:互联网 发布:北大青鸟java收费 编辑:程序博客网 时间:2024/06/07 15:04

这段代码对一些读入的非法数据判断存在错误
比如像出现 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';}elsef = '<';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;elsecout<<"读入数据有错!\n";}


 

0 0
原创粉丝点击