Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

CUGLSF/CodingInterviews

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

320 Commits

Repository files navigation

#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;

}

About

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

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 98.2%
  • Makefile 1.1%
  • Other 0.7%

AltStyle によって変換されたページ (->オリジナル) /