20. Paréntesis válidos
Después de hablar de pilas que implementan colas y colas que implementan pilas, el siguiente paso es la aplicación clásica de pilas.
Esta pregunta es una explicación de las tres situaciones.
Enlace al tema: Lituo
Idea de código: Primero juzgue la longitud de la cadena. Si la longitud de la cadena es impar, puede saber que obviamente no cumple con el significado de la pregunta. En este momento, devuelva falso directamente; luego recorra la cadena correspondiente y juzgue los tres escenarios.En el caso de corchetes, realice la operación push correspondiente; (2 3 casos) A continuación, busque la pila.top() es diferente a la siguiente, directamente devuelve falso/si la pila está vacía, también devuelve falso . (Caso 1) El último paso es devolver si la pila está vacía.
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. Eliminar todos los duplicados adyacentes en una cadena --- Juego de eliminación de amor
Saber por qué la pila es adecuada para este tipo de operación similar a la eliminación de amor, porque la pila nos ayuda a registrar cuál es el elemento anterior al atravesar el elemento actual de la matriz.
Por ejemplo, como se muestra a continuación: abbaca, después de eliminar los duplicados es c.
Idea: primero, declare una pila para almacenar cadenas y pregunte si la cola es la misma que la cadena actual. Las mismas palabras realizan una ventana emergente.
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. Evaluación de expresión en polaco inverso
Esta pregunta no es difícil, pero si la haces por primera vez, será difícil pensar en ella, así que primero mira el video, entiende la idea antes de hacer la pregunta.
Enlace a este tema: Likou
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;
}
};