四则表达式计算

四则运算表达式的计算步骤:
(1)利用栈模型将四则表达式转换为后缀表达式;
(2)利用栈模型对后缀表达式进行计算;
需要注意的点:(1)3+2*{1+2*[-4/(8-6)+7]}  这里有一个-4需要处理
                         (2)5-3+9*6*(6-10-2)     中缀表达式中可能出现非个位数的数值如10

#include "iostream"
using namespace std;
#include <string>
#include <stack>
#include <sstream>
#include <vector>
#include "math.h"
void Infix2Suffix(string& str, char* strtmp)
{
	// 需要注意负号表示负数的问题
	stack<char> s;
	int len = 0;
	for (unsigned int i=0; i<str.length(); i++)
	{
		if (str[i] >= 48 && str[i] <= 57)
		{
			strtmp[len] = str[i];
			len++;
			if (i<str.length() && (str[i+1] <48  || str[i+1]>57))
			{
				strtmp[len] = ' '; 
				len++;
			}
		}
		else if (str[i] == '[' || str[i] == '{' || str[i] == '(')
			s.push(str[i]);
		else if(str[i] == '+')
		{
			if (s.empty())
				s.push(str[i]);
			else
			{
				while (!s.empty())
				{
					if (s.top() == '-' || s.top() == '*' || s.top() == '/'|| s.top() == '+')
					{
						strtmp[len] = s.top();
						len++;
						strtmp[len] = ' ';
						len++;
						s.pop();
						if (s.empty())
						{
							s.push(str[i]);
							break;
						}
					}
					else if ( s.top() == '(' || s.top() == '{' || s.top() == '[')
					{
						s.push(str[i]);
						break;
					}
				}
			}
		}
		else if(str[i] == '-')
		{
			// 得先判断减号是不是代表负数
			if (i==0 || ((str[i-1] == '+' || str[i-1] == '*' || str[i-1] == '/' || str[i-1] == '(' || str[i-1] == '[' ||  str[i-1] == '{')))
			{
				strtmp[len] = '0';
				len++;
				strtmp[len] = ' ';
				len++;
			}
			if (s.empty())
				s.push(str[i]);
			else
			{
				while (!s.empty())
				{
					if (s.top() == '+' || s.top() == '*' || s.top() == '/' ||s.top() == '-')
					{
						strtmp[len] = s.top();
						len++;
						strtmp[len] = ' ';
						len++;
						s.pop();
						if (s.empty())
						{
							s.push(str[i]);
							break;
						}
					}
					else if (s.top() == '(' || s.top() == '{' || s.top() == '[')
					{
						s.push(str[i]);
						break;
					}

				}

			}
		}
		else if(str[i] == '*')
		{
			if(s.empty())
				s.push(str[i]);
			else
			{
				while (!s.empty())
				{
					if ( s.top() == '/'||s.top() == '*' )
					{
						strtmp[len] = s.top();
						len++;
						strtmp[len] = ' ';
						len++;
						s.pop();
						if (s.empty())
						{
							s.push(str[i]);
							break;
						}
					}
					else if (s.top() == '+' ||s.top() == '-' || s.top() == '(' || s.top() == '{' || s.top() == '[')
					{
						s.push(str[i]);
						break;
					}

				}
			}
		}
		else if(str[i] == '/')
		{
			if (s.empty())
				s.push(str[i]);
			else
			{
				while (!s.empty())
				{
					if ( s.top() == '*' || s.top() == '/' )
					{
						strtmp[len] = s.top();
						len++;
						strtmp[len] = ' ';
						len++;
						s.pop();
						if (s.empty())
						{
							s.push(str[i]);
							break;
						}
					}
					else if (s.top() == '+' ||s.top() == '-' || s.top() == '(' || s.top() == '{' || s.top() == '[')
					{
						s.push(str[i]);
						break;
					}
				}
			}
		}
		else if (str[i] == ')')
		{
			while (s.top() != '(')
			{
				strtmp[len] = s.top();
				len++;
				strtmp[len] = ' ';
				len++;
				s.pop();
			}
			s.pop();
		}
		else if (str[i] == ']')
		{
			while (s.top() != '[')
			{
				strtmp[len] = s.top();
				len++;
				strtmp[len] = ' ';
				len++;
				s.pop();
			}
			s.pop();
		}
		else if (str[i] == '}')
		{
			while (s.top() != '{')
			{
				strtmp[len] = s.top();
				len++;
				strtmp[len] = ' ';
				len++;
				s.pop();
			}
			s.pop();
		}
	}
	while (!s.empty())
	{
		strtmp[len] = s.top();
		len++;
		strtmp[len] = ' ';
		len++;
		s.pop();
	}
}

int getNumber(string& tmp)
{
	stack<int> a;
	int tmp1 = 0;
	int tmp2 = 0;
	for (int i=0; i<tmp.length(); i++)
	{
		if (tmp[i] >=48 && tmp[i] <=57)
		{
			int count = 0;
			int j = i+1;

			while (j<tmp.length() && (tmp[j]>=48 && tmp[j]<=57) )
				j++;
			for (int k=i; k<j; k++)
			{
				count += (tmp[k]-48)*pow((double)10, (double)(j-i-1));
			}
			i = j;
			a.push(count);
		}

		else
		{
			if (tmp[i] == '+')
			{
				tmp1 = a.top();
				a.pop();
				tmp2 = a.top();
				a.pop();
				tmp1 = tmp2 + tmp1;
				a.push(tmp1);
			}
			else if (tmp[i] == '-')
			{
				tmp1 = a.top();
				a.pop();
				tmp2 = a.top();
				a.pop();
				tmp1 = tmp2 - tmp1;
				a.push(tmp1);
			}
			else if (tmp[i] == '*')
			{
				tmp1 = a.top();
				a.pop();
				tmp2 = a.top();
				a.pop();
				tmp1 = tmp2 * tmp1;
				a.push(tmp1);
			}
			else if (tmp[i] == '/')
			{
				tmp1 = a.top();
				a.pop();
				tmp2 = a.top();
				a.pop();
				tmp1 = tmp2 / tmp1;
				a.push(tmp1);
			}
		}
	}

	return a.top();;
}
int main(void)
{
	string str;
    cin >> str;
	char strtmp[100] = {0};
	Infix2Suffix(str, strtmp);
	string strout = strtmp;

	//cout << strtmp << endl;
	cout << getNumber(strout) << endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值