心胸决定格局,眼界决定境界...

四则运算优先级-栈模拟计算

string make_symbol_stack(string opt)
{
	stack<char>  symbol_stack;
	char result[100] = {'0'};
	memset(result, 0, 100);
	int  index = 0;
	int  last_order = 0;
	int  cur_order = 0;
	int  symbol_to_order[128];
	symbol_to_order['+'] = 0;
	symbol_to_order['-'] = 0;
	symbol_to_order['*'] = 1;
	symbol_to_order['/'] = 1;
	int  flag = 0;
	for (int i = 0; i < opt.length(); i++)
	{
		if ('0' <= opt[i] && opt[i] <= '9')
		{
			result[index++] = opt[i];
			flag = 0;
		}
		else if (opt[i] == ' ')
		{
			//跳过
		}
		else
		{//symbol
			if (flag == 0)//只要把数字与数字之间切分开,即可
			{
				result[index++] = ' ';
				flag = 1; //表示符号
			}

			if (symbol_stack.empty())
			{
				symbol_stack.push(opt[i]);
			}
			else
			{
				char symbol = symbol_stack.top();
				last_order = symbol_to_order[symbol];
				cur_order = symbol_to_order[opt[i]];
				if (cur_order >= last_order || opt[i] == '(')//优先级高,则直接入栈
				{
					symbol_stack.push(opt[i]);
				}
				else//优先级低,则先出栈到合适位置,再入栈
				{
					
					if (opt[i] == ')')
					{
						while (symbol_stack.top() != '(')
						{
							symbol = symbol_stack.top();	
							symbol_stack.pop();
							result[index++] = symbol;
						}
						symbol_stack.pop();
					}
					else
					{
						while (!symbol_stack.empty())
						{
							symbol = symbol_stack.top();
							symbol_stack.pop();
							result[index++] = symbol;
						}
						symbol_stack.push(opt[i]);
					}

					
				}
			}

		}
	}
	while (!symbol_stack.empty())
	{
		char symbol = symbol_stack.top();
		symbol_stack.pop();
		result[index++] = symbol;
	}
	string ret(result, result + strlen(result));
	return ret;
}

int compute_opt(string opt)
{
	cout << "输入:" << opt<<endl;
	string result = make_symbol_stack(opt);
	cout << "后缀:" << result<<endl;
	stack<int> value_stack;
	
	for (int i = 0; i < result.length();i++)
	{
		if ('0' <= result[i] && result[i] <= '9')
		{
			int value = 0;
			while (isdigit(result[i]))
			{
				value = value * 10 + (result[i] - '0');
				i++;
			}
			i = i - 1;
			value_stack.push(value);
		}
		else if (result[i] == ' ')
		{
		}
		else
		{//symbol
			
			int value1 = value_stack.top();
				value_stack.pop();
			int value2 = value_stack.top();
				value_stack.pop();
			int tmp;
			if (result[i] == '+')
				{
					tmp = value2 + value1;
				}
			else if (result[i] == '-')
				{
					tmp = value2 - value1;
				}
			else if (result[i] == '*')
				{
					tmp = value2*value1;
				}
				else//'/'
				{
					tmp = value2 / value1;
				}
				value_stack.push(tmp);
		}
	}
	int ret = value_stack.top();
	cout << "结果:" << ret << endl;
	return ret;
}

string content("9+(3-1)*3+10/2");
int result = compute_opt(content);

  

posted @ 2019-02-17 14:42  WELEN  阅读(612)  评论(0)    收藏  举报