https://github.com/gatieme/CodingInterviews
剑指Offer——名企面试官精讲典型编程题
https://github.com/gatieme/CodingInterviews
Last synced: about 1 month ago
JSON representation
剑指Offer——名企面试官精讲典型编程题
- Host: GitHub
- URL: https://github.com/gatieme/CodingInterviews
- Owner: gatieme
- License: gpl-3.0
- Created: 2016-04-08T08:38:19.000Z (about 9 years ago)
- Default Branch: master
- Last Pushed: 2021-02-20T15:09:56.000Z (about 4 years ago)
- Last Synced: 2024-07-31T22:43:12.765Z (9 months ago)
- Language: C++
- Size: 952 KB
- Stars: 4,818
- Watchers: 175
- Forks: 1,124
- Open Issues: 10
-
Metadata Files:
- Readme: README.MD
- License: LICENSE
Awesome Lists containing this project
- awesome-leetcode - 剑指 Offer 题解
- awesome-github-star - CodingInterviews
- Awesome-Interview - gatieme/CodingInterviews
- awesome-hacking-lists - gatieme/CodingInterviews - 剑指Offer——名企面试官精讲典型编程题 (C++)
- awesome-algorithm - 剑指 Offer 题解
README
#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 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) < fix = {"4", "+", "13", "/", "5"};//中缀表达式
string fix = "2+2*(1*2-4/2)*1";
vector 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;
}