//postFix.h #ifndef POSTFIX_H #define POSTFIX_H #include "iostream" using namespace std; class Operator { public: Operator(){} Operator(char opera, int priority){this->opera = opera; this->priority = priority;} char getOperator(){return opera;} int getPriority(){return priority;} Operator operator=(const Operator& op) { opera = op.opera; priority = op.priority; return *this; } char operator*() { return opera; } //private: char opera; int priority; }; #endif //postFixMain.cpp #include "postFix.h" #include "string" #include "stack" #include "vector" using namespace std; string IndexToPost(); int Calculate(string dest); int main() { //stack<Operator,vector<Operator> >operaStack; const string RESULT = "The result of the expression: "; string dest; dest = IndexToPost(); int result = Calculate(dest); cout<<RESULT<<result<<endl; int i; cin>>i; return 0; } int Calculate(string dest) { Operator add('+',1); Operator minu('-',1); Operator multi('*',2); Operator div('/',2); //stack<Operator, vector<Operator> > operandStack; stack<double,vector<double> >operandStack; int param1; int param2; int result; string temp; for (unsigned int i=0; i<dest.length(); i++) { if ((dest[i] == add.opera) || (dest[i] == minu.opera) || (dest[i] == multi.opera) || (dest[i] == div.opera)) { if (operandStack.empty()) { //exit(0); cout<<"stack empty"<<endl;break; } param2 = operandStack.top(); operandStack.pop(); if (operandStack.empty()) { //exit(0); cout<<"stack empty"<<endl;break; } param1 = operandStack.top(); operandStack.pop(); switch(dest[i]) { case '+': result = param1 + param2; operandStack.push(result);break; case '-': result = param1 - param2; operandStack.push(result);break; case '*': result = param1 * param2; operandStack.push(result);break; case '/': if (param2 == 0) { exit(0); } result = param1/param2; operandStack.push(result);break; } } else if ((dest[i] == ' ')) { size_t length = temp.length(); char* param = new char[length+1]; for (unsigned int i=0; i<temp.length(); i++) { param[i] = temp[i]; } param1 = atoi(param); operandStack.push(param1); temp.clear(); } else { temp += dest[i]; } } result = operandStack.top(); operandStack.pop(); if (!operandStack.empty()) { //exit(0); cout<<"stack not empty"<<endl;break; } return result; } string IndexToPost() { const string PROMPT = "Please enter a string of parentheses "; const string ORGEXP = "The Origin expression is: "; const string PostExp = "The Post expression is: "; Operator add('+',1); Operator minu('-',1); Operator multi('*',2); Operator div('/',2); Operator left('(',0); Operator right(')',3); stack<Operator,vector<Operator> > operaStack; string parens; string dest; string tempvalue; //int rightside = 0; cout<<PROMPT<<endl; cin>>parens; cout<<ORGEXP<<parens<<endl; for (unsigned int i=0; i<parens.length(); i++) { if ((parens[i] == add.opera)||(parens[i] == minu.opera) || (parens[i] == multi.opera) || (parens[i] == div.opera) ) //|| (parens[i] == left.opera) || (parens[i] == right.opera)) { if (operaStack.empty()) //空栈 { switch(parens[i]) { case '+': operaStack.push(add);break; case '-': operaStack.push(minu);break; case '*': operaStack.push(multi);break; case '/': operaStack.push(div);break; /*case '(': operaStack.push(left);break; case ')': exit(0);*/ } tempvalue += ' '; dest += tempvalue; tempvalue.clear(); } else //非空 { Operator compare; switch(parens[i]) { case '+': compare.opera = '+'; compare.priority = 1;break; case '-': compare.opera = '-'; compare.priority = 1;break; case '*': compare.opera = '*'; compare.priority = 2;break; case '/': compare.opera = '/'; compare.priority = 2;break; /*case '(': compare.opera = '('; compare.priority = 0;break; case ')': compare.opera = ')'; compare.priority = 3;break;*/ } if (!tempvalue.empty()) { tempvalue += ' '; dest += tempvalue; tempvalue.clear(); } while (operaStack.top().priority >= compare.priority) { dest += operaStack.top().opera; operaStack.pop(); /*if (rightside > 0) { dest += ' '; --rightside; }*/ } operaStack.push(compare); /*Operator temp = operaStack.top(); if(temp.priority >= compare.priority) //栈顶优先级大于或者等于当前操作符 { dest += temp.opera; operaStack.pop(); //operaStack.push(compare); while () { } } else { operaStack.push(compare); }*/ } } else if (( parens[i] == '(')) { operaStack.push(left); /*if (!tempvalue.empty()) { tempvalue += ' '; dest += tempvalue; tempvalue.clear(); }*/ } else if (( parens[i] == ')')) { if (!tempvalue.empty()) { tempvalue += ' '; dest += tempvalue; tempvalue.clear(); } while (operaStack.top().opera != '(') { Operator temp = operaStack.top(); operaStack.pop(); dest += temp.opera; } operaStack.pop(); //++rightside; } else { tempvalue += parens[i]; //dest += parens[i]; //dest += ' '; // } } if (!tempvalue.empty()) { tempvalue += ' '; dest += tempvalue; tempvalue.clear(); } while (!operaStack.empty()) { if (operaStack.top().opera == '(') { exit(0); } Operator temp = operaStack.top(); operaStack.pop(); dest += temp.opera; } cout<<PostExp<<dest<<endl; return dest; }