算法实验 中缀表达式

来源:互联网 发布:mac怎么关闭访客用户 编辑:程序博客网 时间:2024/04/27 09:46

题目:

实现中缀表达式

类库

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;}


 

1 0
原创粉丝点击