C++Primer 练习9.52(续) 中缀表达式转后缀表达式求值

练习9.52:使用stack处理括号化的表达式。当你看到一个左括号,将其记录下来。当你在一个左括号之后看到一个右括号,从stack中pop对象,直至遇到右括号,将左括号也一起弹出栈。让后将一个值(括号内的运算结果)push到栈中,表示一个括号化的(子)表达式已经处理完毕,被其运算结果所替代。

说明:上一篇写了关于中缀表达式求值的问题,对计算机而言,后缀表达式求值更加方便,不需要考虑符号的优先级,本篇在上一篇的基础上进行了小小改动,将中缀表达式的求值过程转化为后缀表达式的求值过程。

网上对于中缀表达式以及后缀表达式的例子,很多,这里不赘述,附上源码

/*
*练习9.52(续) 
*2015/8/9 
*说明:在练习9.52的基础啊上,将中缀表达式转化为后缀表达式进行计算,主要过程和9.52的几乎一样,但各个函数的功能更加明确(符数的情况没有考虑) 
*int priority() 符号的优先级 
*void shapeExpression(vector<string> vec);中缀表达式转后缀表达式
*int caculate();栈的计算过程
*int caclcuExpression();后缀表达式的计算过程

*参考:海子 
*参考网址:http://www.cnblogs.com/dolphin0520/p/3708602.html
*作者:Nick Feng
*邮箱:nickgreen23@163.com  
*/

#include <iostream>
#include <vector>
#include <string>
#include <stack>

using namespace std;

int priority(string opt)
{
	int p = 0;
	if(opt == "+" || opt == "-")
		p = 1;
	if(opt == "*" || opt == "/")
		p = 2;
	if(opt == "(")
		p = 0;
	return p;
}

vector<string> shapeExpression(vector<string> &vec)
{
	stack<string> stack_opt;
	vector<string> vec2;
	
	for(auto i = 0; i != vec.size(); ++i)
	{
		string token = vec[i];
		if(token == "+" || token == "-" || token == "*" || token == "/")
		{
			if(stack_opt.size() == 0)
				stack_opt.push(token);
			else
			{
				int token_p = priority(token);
				string top_opt = stack_opt.top();
				int opt_p = priority(top_opt);
				if(token_p > opt_p)
					stack_opt.push(token);
				else {
					while(token_p <= opt_p)
					{
						//stack_opt.pop();
						vec2.push_back(top_opt);
						stack_opt.pop();
						if(stack_opt.size() != 0)
						{
							top_opt = stack_opt.top();
							opt_p = priority(top_opt);
						}
						else
						    break;
					}
					stack_opt.push(token);
				}
			}
		}
		else if(token == "(")
			stack_opt.push(token);
		else if(token == ")")
		{
			while(stack_opt.top() != "(")
			{
				string top_opt = stack_opt.top();
				vec2.push_back(top_opt);
				stack_opt.pop();
			}
			stack_opt.pop();
		}
		else 
		{
			vec2.push_back(token); 
		}
	}
	while(stack_opt.size() != 0)
	{
		string top_opt = stack_opt.top();
		vec2.push_back(top_opt);
		stack_opt.pop();
	}
	/*
	for(int i = 0; i != vec2.size(); ++i)
		cout << vec2[i] << " ";
		cout << endl;*/
		return vec2;
}


int calculate(stack<int> &stack_opd,string opt)
{
	if(opt == "+")
	{
		int ropd = stack_opd.top();
		stack_opd.pop();
		int lopd = stack_opd.top();
		stack_opd.pop();
		int result = lopd + ropd;
        stack_opd.push(result);
	}
	if(opt == "-")
	{
		int ropd = stack_opd.top();
		stack_opd.pop();
		int lopd = stack_opd.top();
		stack_opd.pop();
		int result = lopd - ropd;
        stack_opd.push(result);
	}
	if(opt == "*")
	{
		int ropd = stack_opd.top();
		stack_opd.pop();
		int lopd = stack_opd.top();
		stack_opd.pop();
		int result = lopd * ropd;
        stack_opd.push(result);
	}
	if(opt == "/")
	{
		int ropd = stack_opd.top();
		stack_opd.pop();
		int lopd = stack_opd.top();
		stack_opd.pop();
		int result = lopd / ropd;
        stack_opd.push(result);
	}
}

int calcuExpression(vector<string> vec)
{
	stack<int> stack_opd;
	//string s = "0123456789"
	for(int i = 0; i != vec.size(); ++i)
	{
		string token = vec[i];
		if(token == "+"|| token == "-" || token == "*" || token == "/")
			calculate(stack_opd,token);
		else
		   stack_opd.push(atoi(token.c_str()));
	}
	return stack_opd.top();
}
int main()
{
	vector<string> v1 = {"(","1","+","2",")","*","4","/","(","1","+","1",")"};
	
	for(auto i = 0; i != v1.size(); ++i)
		cout << v1[i] << " ";
		cout << endl;
		
	vector<string> v2 = shapeExpression(v1);
	for(auto i = 0; i != v2.size(); ++i)
		cout << v2[i] << " ";
		cout << endl;
		
	cout << calcuExpression(v2) << endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值