/**/ //////表达式计算////数据结构:栈////作者:ZZJ_4Ever/// #include < iostream > #include < stack > #include < string > #include < assert.h > using namespace std;stack < double > data_stack;stack < char > char_stack; int PRI( char & ch) ... { if(ch==')')...{return 1;} else if(ch=='+'||ch=='-')...{return 2;} else if(ch=='*'||ch=='/')...{return 3;} else return 0;} /**/ /*2.扫描到操作符,与操作符栈的顶端操作符进行比较, 如果优先级小或相等,则弹出数据和操作符进行计算,将结果送入数据栈; 如果优先级较大,则进操作符栈; 如果是’(‘直接进栈,如果是’)’,遇到’(‘则抵消.*/ void Exc_stack() ... { double result_temp; assert(char_stack.size()>=1&&data_stack.size()>=1); double temp1=data_stack.top(); data_stack.pop(); double temp2=data_stack.top(); data_stack.pop(); char popchar=char_stack.top(); char_stack.pop(); if(popchar=='+') result_temp=temp2+temp1; else if(popchar=='-') result_temp=temp2-temp1; else if(popchar=='*') result_temp=temp2*temp1; else if(popchar=='/') result_temp=temp2/temp1; data_stack.push(result_temp);} void push_charinto( char & ch) ... { if(ch=='(')//如果是’(‘直接进栈 char_stack.push(ch); else if(char_stack.empty()) ...{ char_stack.push(ch); } else if(PRI(ch)>PRI(char_stack.top()))//如果优先级较大,则进操作符栈 ...{ char_stack.push(ch); } //扫描到操作符 else//如果优先级小或相等,则弹出数据和操作符进行计算,将结果送入数据栈 ...{ Exc_stack(); if(ch==')')//如果是’)’,遇’(‘直接弹出. ...{ while(char_stack.top()!='(')//操作括号内的内容直到遇到'('为止 ...{ Exc_stack(); } char_stack.pop(); } else //将自己压入栈 char_stack.push(ch); } } void push_datainto( double & db) ... { data_stack.push(db);} void main() ... { string str; while(1) ...{ bool flag=false; double ret = 0.0; double n ; cout<<"在此输入表达式:"; //读 入 cin>>str; //处理 //筛选 /**/ /////开始扫描 /// for(int i=0;i<str.length();i++) ...{ if(str[i]>='0' && str[i]<='9') ...{ if(!flag) ret = ret *10 + str[i]-'0'; else ...{ ret = ret + (str[i]-'0')/n; n*=10; } } else if(str[i] == '.') ...{ n = 10; flag = true; } else ...{ if(ret!=0 || str[i-1]=='0') push_datainto(ret); ret=0.0; flag = false; push_charinto(str[i]); } } //如果最后一个数字还没有压入栈 if(ret!=0||str[i-1]=='0')push_datainto(ret); //3.扫描数据完成后,依次退栈并进行计算 assert(!data_stack.empty()||!char_stack.empty()); while(data_stack.size()!=1) ...{ Exc_stack(); } // double rre=data_stack.top(); cout<<"结果:"<<data_stack.top()<<endl; data_stack.pop(); }}