表达式求值

方法一:

// exam1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;

int priority(char op)
{
	switch(op)
	{
	case '(':
		return 1;
	case '+':
	case '-':
		return 2;
	case '*':
	case '/':
		return 3;
	case ')':
		return 4;
	case '#':
		return 5;
	}
}

bool cmp_lg(char op1,char op2)
{
	int proi1=priority(op1);
	int proi2=priority(op2);

	if(proi1>=proi2)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int cal_func(char op,int num1,int num2)
{
	switch(op)
	{
	case '+':
		return num1+num2;
	case '-':
		return num1-num2;
	case '*':
		return num1*num2;
	case '/':
		return num1/num2;
	default:
		return num1+num2;
	}
}

void cal(void)
{
	cout<<"Please enter the formula whose end is '#'..."<<endl;
	char ch;
	stack<int> num;
	stack<char> op;

	while(1)
	{
		cin>>ch;
		if(ch=='#')
		{
			break;
		}

		if(ch>='0' && ch<='9')
		{
			num.push(ch-'0');
		}
		else
		{
			if(op.empty())
			{
				op.push(ch);
			}
			else
			{
				char op1,op2;

				op1=op.top();
				op2=ch;

				if(ch=='(')
				{
					op.push(ch);
				}
				else if(cmp_lg(op1,op2))
				{
					int result,num1,num2;
					num1=num.top();
					num.pop();
					num2=num.top();
					num.pop();

					result=cal_func(op1,num1,num2);
					num.push(result);

					op.pop();
					op.push(op2);
				}
				else
				{
					if(ch==')')
					{
						int result;
						int num1,num2;
						char op0;

						num1=num.top();
						num.pop();
						num2=num.top();
						num.pop();

						op0=op.top();
						op.pop();
						op.pop();
						result=cal_func(op0,num1,num2);
						num.push(result);
					}
					else
					{
						op.push(ch);
					}
				}
			}
		}
	}
	
	while(!num.empty() && !op.empty())
	{
		int result;
		int num1,num2;
		char op0;

		num1=num.top();
		num.pop();
		num2=num.top();
		num.pop();

		op0=op.top();
		op.pop();
		result=cal_func(op0,num1,num2);
		num.push(result);
	}

	cout<<"The result is "<<num.top()<<"."<<endl;
}

int main(void)
{
	cal();

	system("pause");
	return 0;
}

方法二:

将()内看成是一个数,使用递归算法进行解决

上代码

#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;

void calculate(stack<int> &num,stack<char> &op)
{
	int b=num.top();
	num.pop();
	int a=num.top();
	num.pop();
	char sym=op.top();
	op.pop();

	switch (sym)
	{
		case '+':
			num.push(a+b);
			break;
		case '-':
			num.push(a-b);
			break;
		case '*':
			num.push(a*b);
			break;
		case '/':
			num.push(a/b);
			break;
		default:
			;
	}
}

int cal(char* s,int len)
{
	char*p=s;
	stack<int> num;
	stack<char> op;

	while(len!=0)
	{
		if(*p=='(')
		{
			int cnt=1;
			char* cur=p+1;
			while(cnt!=0)
			{
				if(*cur==')')
				{
					cnt--;
				}
				else if(*cur=='(')
				{
					cnt++;
				}
				else{}
				cur++;
			}
			int tmp=cal(p+1,cur-p-2);
			len=len-(cur-p-1);
			num.push(tmp);
			p=cur-1;
		}
		else if(*p<='9' && *p>='0')
		{
			num.push(*p-'0');
		}
		else if(op.empty())
		{
			op.push(*p);
		}
		else if(op.top()=='*' || op.top()=='/')
		{
			calculate(num,op);
			op.push(*p);
		}
		else
		{
			if(*p=='*' || *p=='/')
			{
				op.push(*p);
			}
			else
			{
				calculate(num,op);
				op.push(*p);
			}
		}
		p++;
		len--;
	}

	while(!op.empty())
	{
		calculate(num,op);
	}

	return num.top();
}

int main()
{
	char* s="1+(4-3)*5/5-3+4";

	int result=cal(s,strlen(s));
	cout<<result<<endl;

	 system("pause");
	 return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值