- //============================================================================
- // Name : test04_201100300097.cpp
- // Compiler : MinGCC
- // Language : C/C++
- // Description : test03_201100300097 in C++, Ansi-style
- //============================================================================
- #include<iostream>
- #include<stack>
- #include<string>
- using namespace std;
- int Level(char m){//算符号优先级
- switch (m){
- case '+':
- case '-':
- return 1;
- case '*':
- case '/':
- return 2;
- case '(':
- case ')':
- return 0;
- case '#':
- return -1;
- default:
- break;
- }
- }
- int main(){
- stack<char>y;
- stack<int>x;
- string s=" ";
- string ss;
- string l=" ";
- cout<<"Input"<<endl;
- cin>>s;
- ss=s;
- s+="#$";//#将y中的运算符都拿出来,$用于表示算式结尾
- int i=0;
- double c=0;
- bool m=1;
- while(s[i]!='$')
- {
- //put number into stack
- if(s[i]>47&&s[i]<58){//the char 0-9 of ASCII is 47-58
- l+=s[i];
- for(int j=i+1;s[j]>47&&s[j]<58;j++)
- l+=s[j];
- x.push(atoi(l.c_str()));
- l=" ";
- i=j;
- }
- if(s[i]>=35&&s[i]<=47){
- if(y.size()==0||s[i]=='('||Level(s[i])>Level(y.top()))
- y.push(s[i]);
- else{
- if(s[i]==')'){//遇到')'的情况,直接将y中的符号一个一个拿出来运算,直到//遇到'('为止
- for(;y.top()!='(';y.pop()){
- char d=y.top();
- double a=x.top();
- x.pop();
- double b=x.top();
- x.pop();
- switch(d){
- case '+':{
- c=a+b;
- break;
- }
- case '-':{
- c=b-a;
- break;}
- case '*':{
- c=a*b;
- break;}
- case '/':{
- c=b/a;
- break;}
- default:
- break;
- }
- x.push(c);
- }
- y.pop();
- }
- else{ //遇到+,-,*,/的处理
- for(;y.size()!=0&&Level(s[i])<=Level(y.top());y.pop()){{
- char d=y.top();
- int a=x.top();
- x.pop();
- int b=x.top();
- x.pop();
- switch(d){
- case '+':{
- c=a+b;
- break;}
- case '-':{
- c=b-a;
- break;}
- case '*':{
- c=a*b;
- break;}
- case '/':{
- c=b/a;
- break;}
- default:
- break;
- }//end of switch
- x.push(c);
- }//end of if
- }//end of for
- y.push(s[i]);
- }
- }//end of else*/
- i++;
- }
- else{
- cout<<"Expression"<<s[i]<<"is a wrong matter!";
- m=0;
- break;
- }
- }//end of while
- if(m)
- cout<<"Output"<<endl;
- cout<<x.top()<<endl;
- cout<<"End"<<endl;
- return 0;
- }
- //该片段来自于http://www.codesnippet.cn/detail/311020136840.html
来源: http://www.codesnippet.cn/detail/311020136840.html