/CodingInterviews

剑指Offer——名企面试官精讲典型编程题

Primary LanguageC++GNU General Public License v3.0GPL-3.0

#include #include #include #include using namespace std;

//判断是否为操作符 bool isOperator(char op) { return (op == '+' || op == '-' || op == '*' || op == '/'); }

//判断是否为数字 bool isDigit(char op) { return (op >= '0' && op <= '9'); }

//计算表达式结果 int cal(int left, int right, char op) { int res = 0; if (op == '+') res = left + right; else if (op == '-') res = left - right; else if (op == '*') res = left * right; else if (op == '/') res = left / right; return res; }

//判断运算符优先级 int pirority(char op) { if (op == '+' || op == '-') return 1; if (op == '*' || op == '/') return 2; else return 0; }

//逆波兰表达式转中缀表达式 int evalRPN(string &tokens) { if (tokens.size() <= 0) return 0; stack s1;//创建辅助栈 int left = 0, right = 0;//定义左/右操作数 int result = 0;//定义中间结果 string temp; for (unsigned int i = 0; i < tokens.size(); i++ ) {

	if (isDigit(tokens[i]))//扫描数字入栈
	{
		temp.push_back(tokens[i]);
	}
	else if (tokens[i] == ' ')
	{
		if (temp.size() > 0)   //防止运算符后面跟分隔符,所以判断一下temp里面是否有数字
		{
			s1.push(atoi(temp.c_str()));
			temp.clear();
		}
	}
	else if (isOperator(tokens[i]) && !s1.empty())
	{
		//防止数字后面直接跟运算符,所以这里也要判断一下temp是否还有数字没有提取出来
		if (temp.size() > 0)
		{
			s1.push(atoi(temp.c_str()));
			temp.clear();
		}
		right = s1.top();
		s1.pop();
		
		left = s1.top();
		s1.pop();
	
		result = cal(left, right, tokens[i]);
		s1.push(result);
	}
	
}
if (!s1.empty())
{
	result = s1.top();
	s1.pop();
}

return result;

}

//中缀表达式转逆波兰表达式 vector infixToPRN(const string & token) { vector v1; int len = token.size();//string的长度 if (len == 0) return v1;

stack<char> s1;//存放逆波兰式的结果
int outLen = 0;
for (int i = 0; i < len ; i++)
{
	if (token[i] == ' ')//跳过空格
		continue;
	if (isDigit(token[i]) )//若是数字,直接输出
	{
		v1.push_back(token[i]);
	}
	else if (token[i] == '(')//如果是'(',则压栈
	{
		s1.push(token[i]);
	}else if (token[i] == ')')//如果是')', 则栈中运算符逐个出栈并输出,直至遇到'('。 '('出栈并丢弃
	{
		while (s1.top() != '(')
		{
			v1.push_back( s1.top());
			s1.pop();
		}
		s1.pop();//此时栈中为')',跳过
	}
	while (isOperator(token[i]))//如果是运算符
	{
		//空栈||或者栈顶为)||新来的元素优先级更高  
		if( s1.empty() || s1.top() == '(' || pirority(token[i]) > pirority(s1.top()))
		{
			s1.push(token[i]);// 当前操作符优先级比栈顶高, 将栈顶操作符写入后缀表达式
			break;
		}else 
		{
			v1.push_back(s1.top());
			s1.pop();
		}
		 
		
	}
}
while (!s1.empty())//输入结束,将栈中剩余操作符出栈输出
{
	v1.push_back(s1.top());
	s1.pop();
}
return v1;

} int main() { //vector sRPN = {"4", "13", "5" , "/", "+"};//逆波兰表达式 //cout << "逆波兰表达式结果为:" << evalRPN(sRPN) <<endl;

//vector<string> fix = {"4", "+", "13", "/", "5"};//中缀表达式
string fix = "2+2*(1*2-4/2)*1";
vector<char> RPN = infixToPRN(fix);
string s_fix;
for (auto it = RPN.begin(); it != RPN.end(); it++)
{
	cout << *it << " ";
	s_fix += *it;
	s_fix += " ";
}
cout << endl;
cout << "逆波兰表达式结果为:" << evalRPN(s_fix) << endl;



system("pause");

return 0;

}