20. 有效的括号
讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。
这一个题就是将三种情况进行一个说明。
题目链接:力扣
代码思路:首先判断字符串的长度,如果字符串的长度是奇数,可以知道明显是不符合题意的,此时直接return false;接下来进行遍历相应的字符串,判断三种场景,就是几种括号的情况进行相应的push操作;(2 3 情况)接下来找寻栈.top()和下面的不一样,直接return false/若栈为空了,也进行return false。(1 情况)最后就是进行return 栈是否为空。
class Solution {
public:
bool isValid(string s) {
//首先要进行判断奇数,如果要是奇数,直接返回false
if(s.size()%2!=0)
{
return false;
}
//首先声明一个stack,用来存放对应的括号
stack<char> panduan;
for(int i = 0;i<s.size();i++)
{
if(s[i]=='(')
{
panduan.push(')');
}
else if(s[i]=='{')
{
panduan.push('}');
}
else if(s[i]=='[')
{
panduan.push(']');
}
else if( panduan.empty()||s[i] != panduan.top() )//这个地方需要注意
{
return false;
}
else
{
panduan.pop();
}
}
return panduan.empty();
}
};
1047. 删除字符串中的所有相邻重复项 --- 爱消除游戏
要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。
题目链接:
力扣
比如说如下所示:abbaca,删除重复项之后是c。
思路:首先是声明一个栈,用来存放字符串,询问尾部是否与现在的字符串相同。相同的话进行一个弹出。
class Solution {
public:
string removeDuplicates(string s) {
//这道题是比较简单的
//首先声明一个栈,用来存放相应的字符
stack<char> cun;
for(int i = 0;i<s.size();i++)
{
if(cun.empty()||cun.top()!=s[i])
{
cun.push(s[i]);
}
else
{
cun.pop();
}
}
string result="";//存放返回值
while(!cun.empty())//这个地方是不能够使用for进行判断的
{
result+=cun.top();
cun.pop();
}
reverse(result.begin(),result.end());
return result;
}
};
150. 逆波兰表达式求值
本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题
本题链接:力扣
class Solution {
public:
int evalRPN(vector<string>& tokens) {
//首先定义一个栈
stack<long long> use;
for(int i = 0;i<tokens.size();i++)
{
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
{
long long k1 = use.top();
use.pop();
long long k2 = use.top();
use.pop();
if(tokens[i]=="-")
{
use.push(k2-k1);
}
if(tokens[i]=="+")
{
use.push(k2+k1);
}
if(tokens[i]=="*")
{
use.push(k2*k1);
}
if(tokens[i]=="/")
{
use.push(k2/k1);
}
}
else
{
use.push(stoll(tokens[i]));//stoll 将string转换为long long类型
}
}
int result = use.top();
use.pop();
return result;
}
};