题目:
实现中缀表达式
类库
栈
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;
}