代码随想录刷题第11天
有效的括号
/*
* @lc app=leetcode.cn id=20 lang=cpp
*
* [20] 有效的括号
*/
// @lc code=start
#include <string>
#include <stack>
using namespace std;
class Solution {
public:
bool isValid(string s) {
stack<char> st;
if (s.size() % 2 != 0)
{
return false;
}
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '(')
{
st.push(')');
}else if (s[i] == '{')
{
st.push('}');
}else if (s[i] == '[')
{
st.push(']');
}else if (st.empty() || s[i] != st.top())
{
return false;
}else
{
st.pop();
}
}
return st.empty();
}
};
// @lc code=end
删除字符串中的所有相邻重复项
/*
* @lc app=leetcode.cn id=1047 lang=cpp
*
* [1047] 删除字符串中的所有相邻重复项
*/
// @lc code=start
#include <string>
#include <stack>
#include <algorithm>
using namespace std;
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for (int i = 0; i < s.size(); i++)
{
if (st.empty() || s[i] != st.top())
{
st.push(s[i]);
}else
{
st.pop();
}
}
string result = "";
while (!st.empty())
{
result += st.top();
st.pop();
}
reverse(result.begin(),result.end());
return result;
}
};
// @lc code=end
逆波兰表达式求值
/*
* @lc app=leetcode.cn id=150 lang=cpp
*
* [150] 逆波兰表达式求值
*/
// @lc code=start
#include <string>
#include <stack>
#include <vector>
using namespace std;
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;
for (int i = 0; i < tokens.size(); i++)
{
if (tokens[i] == "+"||tokens[i] == "-"||tokens[i] == "/"||tokens[i] == "*")
{
long long num1 = st.top();//second num
st.pop();
long long num2 = st.top();//first num
st.pop();
if (tokens[i] == "+")
{
st.push(num1+num2);
}else if (tokens[i] == "-")
{
st.push(num2 -num1);
}else if (tokens[i] == "*")
{
st.push(num2*num1);
}else if (tokens[i] == "/")
{
st.push(num2/num1);
}
}else
{
st.push(stoll(tokens[i]));
}
}
return st.top();
}
};
// @lc code=end
栈用来做临近的字符或者数组的匹配上特别方便的,如果有类似的情况,可以第一时间想到利用栈来解决