算法实验 中缀表达式

题目:

实现中缀表达式

类库

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值