算法实验 中缀表达式
来源:互联网 发布: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
- 算法实验 中缀表达式
- 中缀表达式算法实现&中缀表达式转后缀表达式
- 中缀表达式转换为后缀表达式算法
- 中缀表达式转换后缀表达式---算法
- 算法之中缀表达式和后缀表达式
- (七)中缀表达式转换后缀表达式算法
- 算法之中缀表达式和后缀表达式
- 中缀和后缀表达式求值算法
- 蓝桥杯 算法训练:表达式计算 中缀表达式变后缀表达式
- 中缀表达式
- 中缀表达式
- 中缀表达式
- 有关中缀表达式转换成后缀表达式的算法
- 中缀表达式转换为后缀表达式的算法
- 中缀表达式变成等价的后缀表达式的算法
- 数据结构算法:中缀表达式转化为后缀表达式
- 中缀表达式转后缀表达式算法及实现
- 【算法与数据结构】中缀表达式转为后缀表达式
- STL_summary
- select for update
- 使用xml创建动态图片
- VirtualBox 收缩 vdi镜像文件
- android 应用中进程和线程是如何运行的
- 算法实验 中缀表达式
- 游戏的几个原则
- 最简单搭建android开发环境
- 怎么了怎么了
- Android性能优化
- 消除SDK更新时的“https://dl-ssl.google.com refused”错误
- 专家预测今年房地产业现两极分化 地方政府或救市
- 关于JAVA方法的值传递和引用传递
- error C2061: syntax error : identifier 'BinryTreeNode'