表达式--栈的实现(数据结构)
这段代码对一些读入的非法数据判断存在错误
比如像出现 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"; }