题目:
实现中缀表达式
类库
栈
Stack.h
/*2014-3-21 后序计算的Stack类库*/ #pragma once #include<iostream> #include<string> using namespace std; const int MaxStackSize=100; class DateType { public: char c; int number; //char carId[10]; //DateType(){c=0,number=0;} //DateType(char _c=0,int _number=0){c=_c,number=_number;} DateType(char _c=0,int _number=0){c=_c,number=_number;} }; class Stack { public: DateType stackList[MaxStackSize]; int top; Stack(); bool IsEmpty(); bool IsFull(); DateType GetTop(); void push(const DateType ); DateType Pop(); void Clear(); }; Stack::Stack() { top=-1; } bool Stack::IsEmpty() { if(top==-1){return true;} else {return false;} } bool Stack::IsFull() { if(top==(MaxStackSize-1)){return true;} return false; } DateType Stack::Pop() { if(IsEmpty()){;} else{return stackList[top--];} } DateType Stack::GetTop() { if(IsEmpty()){;}else {return stackList[top];} } void Stack::push(const DateType dt) { if(IsFull()){return ;} else{stackList[++top]=dt;}//相同类类型之间可以相互赋值 } void Stack::Clear() { memset(stackList,0,sizeof(stackList)); top=-1; }
队列
Queue.h
不过好像没用到
/*2014-3-21 后序计算的Queue类库*/ #pragma once #include<iostream> using namespace std; const int MaxQueueSize=100; class DataType { public: char c; int number; }; class Queue { public: int front,rear; DataType queueList[MaxQueueSize]; Queue(); void Enter(DataType item); DataType Leave(); void Clear(); DataType Front(); int Length(); bool IsEmpty(); bool IsFull(); }; Queue::Queue() { front=rear=0; } void Queue::Enter(DataType dt) { if(IsFull()){return ;} else {queueList[++rear]=dt;} } DataType Queue::Leave() { if(rear==front){;} else return (queueList[front++]); } void Queue::Clear() { rear=front=0; memset(queueList,0,sizeof(queueList)); } /*DataType Queue::Front() { }*/ int Queue::Length() { return 0; } bool Queue::IsEmpty() { if(rear==front){return true;} else return false; } bool Queue::IsFull() { if((rear+1)%MaxQueueSize==front){return true;} else return false; }
main函数文件
/*2014-3-19 后续排序 栈堆实现 可以支持多位的数字运算*/ #include<iostream> #include<string> #include"Stack.h" using namespace std; const char Op[9][9]={{‘0‘,‘^‘,‘*‘,‘/‘,‘+‘,‘-‘,‘(‘,‘)‘,‘#‘}, {‘^‘,‘>‘,‘>‘,‘>‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘}, {‘*‘,‘<‘,‘>‘,‘>‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘}, {‘/‘,‘<‘,‘>‘,‘>‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘}, {‘+‘,‘<‘,‘<‘,‘<‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘}, {‘-‘,‘<‘,‘<‘,‘<‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘}, {‘(‘,‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘=‘,‘0‘}, {‘)‘,‘>‘,‘>‘,‘>‘,‘>‘,‘>‘,‘0‘,‘>‘,‘>‘}, {‘#‘,‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘0‘,‘=‘}, };//关于运算符的优先级判断矩阵 列为先出现的运算符,行为后出现的运算符 //利用数组对于运算符1和运算符2的优先级进行比较 OP1是在前面出现的运算符 const int MAXN=1000; static int variable[MAXN]; char Compare(char op1,char op2) { bool flagOp1=false,flagOp2=false; int i,j,column,row; for( i=1;i<=8;i++){if(op1==Op[i][0]){row=i;flagOp1=true;break;}}//列 for( j=1;j<=8;j++){if(op2==Op[0][j]){column=j;flagOp2=true;break;}}//行 if(flagOp1&&flagOp2){return Op[row][column];} } //将字符运算符和两个操作数字输入运算出结果 int Operator(int a,char op,int b)// { switch(op) { case ‘^‘:{return a^b;break;} case ‘*‘:{return a*b;break;} case ‘/‘:{return a/b;break;} case ‘+‘:{return a+b;break;} case ‘-‘:{return a-b;break;} default:{break;} } } //对于计算的一系列字符串进行分析 返回结果 支持100位以内整数数字的计算 int EvaluateExpression(char str[],int n) { int i=0,length=n-1; Stack sNumber,sOperator; DateType tempt(‘#‘,0); sOperator.push(tempt); while(!((sOperator.GetTop().c ==‘#‘)&&(str[i]==‘#‘))) { if(i>length){break;} if((str[i]>=‘0‘)&&(str[i]<=‘9‘)) { int count=0; memset(variable,0,sizeof(variable)); while((str[i]>=‘0‘)&&(str[i]<=‘9‘)) { variable[count++]=str[i]-‘0‘; i++; } i--; int number=0; for(int i=0;i<count;i++) { number=number*10+variable[i]; } DateType tempt(0,number); sNumber.push(tempt); }//如果为数字 else { //if(str[i]==‘(‘){DateType tempt(str[i],0);sOperator.push(tempt);} //else //{ switch(Compare(sOperator.GetTop().c,str[i]))//先出现运算符比较后出现的运算符 { case‘<‘:{DateType tempt(str[i],0);sOperator.push(tempt); break;} case‘=‘:{sOperator.Pop();break;} case‘>‘: { char op=sOperator.Pop().c; int a=sNumber.Pop().number,b=sNumber.Pop().number; b=Operator(b,op,a); DateType tempt(0,b); sNumber.push(tempt); i--; break; } default:{break;} } //} } i++; } return sNumber.GetTop().number; } int main() { //char str[]="2*(1+(5+1))+1*7#";//尾位自动添加‘/0‘ 对于字符串可以输出 char str[]="20*100#"; int result=EvaluateExpression(str, strlen(str)); cout<<result; return 0; }
原文:http://blog.csdn.net/u010416101/article/details/22185201