c++算數表達式求值

#include <iostream>
#include <string>
#include <cstring>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <stack>
#include <sstream>
using namespace std;

int priority(char a, char b)
{
	if(a == '+')
	{
		if(b == '+' || b == '-' || b == ')' || b == '#')
			return 1;
		else if(b == '*' || b == '/' || b == '(')
			return -1;
	}
	else if(a == '-')
	{
		if(b == '+' || b == '-' || b == ')' || b == '#')
			return 1;
		else if(b == '*' || b == '/' || b == '(')
			return -1;
	}
	else if(a == '*')
	{
		if(b == '+' || b == '-' || b == '*' || b == '/' || b==')' || b == '#')
			return 1;
		else
			return -1;
	}
	else if(a == '/')
	{
		if(b == '+' || b == '-' || b == '*' || b == '/' || b==')' || b == '#')
			return 1;
		else
			return -1;
	}
	else if(a == '(')
	{
		if(b == '+' || b == '-' || b == '*' || b == '/' || b == '(')
			return -1;
		else if(b == ')')
			return 0;
	}
	else if(a == ')')
	{
		return 1;	
	}
	else if(a == '#')
	{
		if(b == '+' || b == '-' || b == '*' || b == '/' || b=='(')
			return -1;
		else if(b == '#')
			return 0;
	}
}

double calculate(char op, double a, double b)
{
	if(op == '+')
		return a+b;
	else if(op == '-')
		return b - a;
	else if(op == '*')
		return a*b;
	else if(op == '/')
		return b/a;
}

double ToNum(string num)
{
	int re = 0;
	for(int i = 0; i < num.length(); ++i)
		re = re*10 + (num[i] - '0');
		
	return re;
}

int main()
{
    string s;
    while(cin >> s)
    {
    	s+='#';
    	stack<char> op;//操作符 
    	stack<double> operand;//操作數 
    	string num;
    //	int tem;
		op.push('#');
		
		for(int i = 0; i < s.length(); ++i)
		{
			if(s[i] >= '0' && s[i] <= '9')
			{
				num = "";
				while(s[i] >= '0' && s[i] <= '9')
				{
					num += s[i];
					++i;
				}
				double t = ToNum(num);
			//	cout << num << endl;
				operand.push(t);
				--i;//注意回一位 
			}
			else
			{
				if(priority(op.top(), s[i]) == -1)
					op.push(s[i]);
				else if(priority(op.top(), s[i]) == 0)
					{
						op.pop();
					}
				else if(priority(op.top(), s[i]) == 1)
					{
						char o = op.top();
						op.pop();
						double a = operand.top();
						operand.pop();
						double b = operand.top();
						operand.pop();
						
						double tem = calculate(o, a, b);
						operand.push(tem);
						--i;//回一位 
					}
			}
		} 
		 
		cout << operand.top() << endl;;
	}
    
    return 0;
}

主要是棧的思想,注意細節。嚴蔚敏老師的《數據結構》有詳解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章