1.前缀、中缀和后缀表达式
如果大家对这些表达式还不知道的话,可以参考资料
2.逆波兰(后缀)表达式求解
在这里我们以LeetCode上的一道面试题为例,题目描述如下图:
解题思路很明确,在求解后缀表达式的时候,我们可以选用栈这种结构,遇到数字入栈,遇到符号连续出栈两次,并将运算结果入栈。接下来看下代码是如何实现的。
# include<iostream>
using namespace std;
# include<string>
# include<vector>
# include<stack>
int evalRPN(vector<string>& tokens)
{
stack<int> s;
for (auto ele : tokens)
{
if (ele.size() == 1 && (ele[0] == '+' || ele[0] == '-' || ele[0] == '*' || ele[0] == '/'))
{
int value1 = s.top();
s.pop();
int value2 = s.top();
s.pop();
switch (ele[0])
{
case '+':
s.push(value2 +value1);
break;
case '-':
s.push(value2-value1);
break;
case '*':
s.push(value2 * value1);
break;
case '/':
s.push(value2 / value1);
break;
}
}
else
{
s.push(atoi(ele.c_str()));
}
}
return s.top();
}
int main()
{
vector<string> tokens;
tokens.push_back("2");
tokens.push_back("1");
tokens.push_back("+");
tokens.push_back("3");
tokens.push_back("*");
cout << evalRPN(tokens);
return 0;
}
3.括号匹配问题
问题描述:
给定一个字符串,里边可能包含“()”、"{}"、“[]”三种括号,请编写程序检查该字符串的括号是否成对出现。
输出:
true:代表括号成对出现并且嵌套正确,或字符串无括号字符。
false:未正确使用括号字符。
我们可以巧妙的使用栈来解决这个问题,当遍历到右括号时,栈顶元素必须是左括号才能出栈,否则入栈。
bool Match(string str)
{
stack<char> s;
for (auto ele : str)
{
if (ele == '{' || ele == '[' || ele == '(')
{
s.push(ele);
}
else
{
switch (ele)
{
case '}':
if (s.top() == '{')
s.pop();
break;
case ']':
if (s.top() == '[')
s.pop();
break;
case ')':
if (s.top() == '(')
s.pop();
break;
}
}
}
return s.empty() ? true : false;
}