表达式求值(多位)

#include <iostream>
#define MAXSIZE 100
using namespace std;

//****************
char Positive = '+';
char Negative = '+';
//****************
typedef struct DOPND
{
		//栈
	int Arr[MAXSIZE];				//先改为数字栈
		//栈顶指针和栈底指针
	int End,Top;
}OPND;

typedef struct ROPTR
{
		//栈
	char Arr[MAXSIZE];
		//栈顶指针和栈底指针
	int End,Top;
}OPTR;


//初始化栈
template <class Type>
void Init(Type& sta)
{
	
	sta.Top = 0;
	sta.End = 0;
}
//入栈
template <class Type,class Value>
void Push(Type& sta,Value val)
{cout<<val<<endl;
	sta.Top = sta.Top + 1;
	sta.Arr[sta.Top] = val;
}
//出栈
template <class Type,class Val>
void Pop(Type& sta, Val& val)
{
	if(isEmpty(sta))return;
	val = sta.Arr[sta.Top];
	sta.Top = sta.Top - 1;
}
//取栈顶元素
template <class Type,class Val>
Val GetTop(Type& sta,Val val)
{
	if(!isEmpty(sta))
	return sta.Arr[sta.Top];
	return (Val)val;
}

template <class Type>
bool isEmpty(Type& sta)
{
	if(0 == sta.Top)return true;
	return false;
}


//判断ch是不是运算符
bool IsOperator(char ch, char OP[])
{
	for(int i = 0;  i < strlen(OP); i++)
	{
		if(ch == OP[i])
		{
			//ch是运算法返回真
			return true;
		}
	}
		//是操作数
	
	return false;
}

//判断运算符栈顶元素和读入运算符的优先关系
char Precede(char Sta_operator,char Input_perator)
{
	char cSearchTab[7][7] = {'>','>','<','<','<','>','>',
					   '>','>','<','<','<','>','>',
					   '>','>','>','>','<','>','>',
					   '>','>','>','>','<','>','>',
					   '<','<','<','<','<','=','0',
					   '>','>','>','>','0','>','>',
					   '<','<','<','<','<','0','='};
	char cArr[7] = {'+','-','*','/','(',')','='};
	
	int x = -1,y = -1;
	for(int i = 0; i < 7; i++)
	{
		if(Sta_operator == cArr[i])
			x = i;
		if(Input_perator == cArr[i])
			y = i;
	}
	return cSearchTab[x][y];
}

//根据操作符计算两个操作数的值
int Operate(int First_Number, char Operator, int Second_Number)
{
//	int iA = First_Number - '0';
//	int iB = Second_Number - '0';
	int iRes = 0;
	switch(Operator)
	{
	case '+':
		iRes = First_Number + Second_Number;
		break;
	case '-':
		iRes = First_Number - Second_Number;
		break;
	case '*':
		iRes = First_Number * Second_Number;
		break;
	case '/':
		iRes = First_Number / Second_Number;
		break;

	}
	return iRes;
}

//将新读入的字符与操作数栈顶元素拼接
void Conn(OPND& Operand,char ch,bool flag)
{
	if(Operand.Top > 0 && false == flag)
	{

		//如果flag == false 说明要进行连接
		int Pre;
		Pop(Operand,Pre);

		char str1[50];

		_itoa(Pre,str1,10);//先获取栈顶元素的字符串的形式
		int len = strlen(str1);
		str1[strlen(str1)] = ch;
		str1[len + 2] = '\0';
//		cout<<"            :"<<Pre<<" "<<str1<<endl;
		Push(Operand,atoi(str1));

	}
	else
	{
		Push(Operand,ch - '0');
	}
	
}

int main()
{
	char OP[] = {'+','-',
				 '*','/',
				 '(',')', 
				 '='};
	//cout<<Operate('1','+','7')<<endl;
	
	char ch;
	bool flag = false;
		//操作数
	OPND Operand;
		//操作符
	OPTR Operator;
		//初始化
	Init(Operand);cin>>ch;
	Init(Operator);Push(Operator,'=');

	while(ch != '=' || GetTop(Operator,'0') != '=')
	{
		//如果输入的不是'=' 并且栈顶元素也不是'='

		if(!IsOperator(ch,OP))
		{
				//如果不是操作符,则连接Operand栈顶元素,并进栈
	
			Conn(Operand,ch,flag);
			cin>>ch;
			flag = false;

		}
		else
		{
			//这块要判断正负数的情况
				//正负数为两种情况 -2+(-3)
								// +2-(+3)
			if(ch == '-' || ch == '+')
			{
				//如果操作数栈为空 或者 操作符栈顶元素为'(',表示接下来的一个数为正负数
				if(isEmpty(Operand) || '(' == GetTop(Operator,'0'))
				{
					Push(Operand,0);//直接把0入栈,然后继续   -2 相当于0-2 
				}
			}


			flag = true;	//操作符下一必为操作数
			switch(Precede(GetTop(Operator,'0'),ch))
			{
			case '<':
				
				Push(Operator,ch);
				cin>>ch;
				break;
			case '>':
				{
					int a,b;
					char Ope;
					//取操作符
					Pop(Operator,Ope);
					//取操作数 
					Pop(Operand,a);
					Pop(Operand,b);
					//计算
					Push(Operand,Operate(b,Ope,a));
				}
				break;
			case '=':
				{
					char x;
					Pop(Operator,x);
					cin>>ch;
				}
				break;
			}
		}

	}
	int Res = GetTop(Operand,49);
	cout<<"结果得: "<<Res<<endl;
	cout<<-0+5<<endl;
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值