day11.# 150. 逆波兰表达式求值;20. 有效的括号;1047. 删除字符串中的所有相邻重复项

string类常用方法

1.初始化

1.string对象初始化为指向的字符串

string str("hello");

2.创建一个包含 n 个元素的 string 对象,其中每个元素都被初始化为字符 c

string str(10,'a');

3.将一个 string 对象初始化为 string 对象 str(复制构造函数)

string str("abcde");
string str2(str);

4.创建一个默认的 string 对象,长度为 0

string str;

5.使用C语言风格字符串处理string对象

string str = "hello!";

2.方法函数

函数Value
push_back()一个 string 对象后面附加一个字符
getline()获取 string 输入getline(cin, str);
string.back()获取或修改字符串最后一个字符str.back() = ‘e’;
string.front()获取或修改字符串第一个字符
string.pop_back()删除字符串最后一个元素
string对象的比较可以直接使用关系运算符if(str1 == str2)
string 对象的拼接string str3 = str1 + str2
str += “abcd”;+= 来在一个 string 对象后面附加一个 string 对象、字符以及 C 风格的字符串
str[2]下标访问,并不会检查是否越界
str.at(2)at 方法访问,会检查是否越界
str.find()方法查找字符
string.insert()插入
string.swap()函数交换两个字符串str1.swap(str2);
swap(str1,str2)函数交换两个字符串

150. 逆波兰表达式求值

1.思路

将数字压栈,遇到运算符弹出前面两个数字,将这两个数字通过运算符计算后的值压入栈

2.重点

1.==运算符用" "而不是’ '==因为数字存放的是string而不是char字符串类型
2.将string类型数字转换为整型 stoi()
3.将string里面存放的char类型数字转换为整型是s[i]-‘0’

3.代码

class Solution {
public:
//遇到符号弹出前面两个数字,通过运算符计算后,在压入栈
stack<int>input;

    int evalRPN(vector<string>& tokens) {
    for(int i=0;i<tokens.size();i++)
    {
        if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
        {   int sum=0;
            int ch1=input.top();
            input.pop();
            int ch2=input.top();
            input.pop();
            if(tokens[i]=="+")sum=ch1+ch2;
            else if(tokens[i]=="-")sum=ch2-ch1;
            else if(tokens[i]=="*")sum=ch1*ch2;
            else if(tokens[i]=="/")sum=ch2/ch1;
            input.push(sum);
        } 
        else{
          input.push(stoi(tokens[i]));
        }
    }
    return input.top();
    }
};

20. 有效的括号

1.思路

1.遍历string字符串遇到’(‘将‘)‘压入栈; 遇到’{‘将’}‘压入栈;遇到’[将’]‘压入栈;
2.遍历string字符串遇到‘)’;‘}’;']'弹出栈顶元素进行匹配,若不相等说明不匹配,返回false
3.最终判断栈里面元素是否为空,空则表示全部匹配上了

3.代码

class Solution {
public:
     stack<char>input;
    bool isValid(string s) {
            for(int i=0;i<s.length();i++)
            {
                if(s[i]=='(')input.push(')');
                if(s[i]=='{')input.push('}');
                if(s[i]=='[')input.push(']');
                if(s[i]==')'||s[i]=='}'||s[i]==']')
                {
                  if(!input.empty()) 
                  {
                      if(input.top()==s[i]) input.pop();
                   
                      else return false;
                }
                else return false;
            }
            }
            if(input.empty())return true;
            else return false;
    }

};

1047. 删除字符串中的所有相邻重复项

1.思路

1.初始化一个栈,完成删除重复项,遍历字符串,与栈顶元素不相同的数字压栈,若遍历的值与栈顶元素相等,则弹出栈顶元素。
2.方法二:初始化一个字符串当成栈

2.重点

  1. reverse函数
    函数功能:将序列[first,last)的元素在原容器中颠倒重排,包含在algorithm库中
    例如:反转字符串
string str="abcd";
reverse(str.begin(),str.end());//str结果为dcba

交换vector容器中元素的顺序

vector<int> v = {5,4,3,2,1}; 
reverse(v.begin(),v.end());//v的值为1,2,3,4,5

2.string类型的用法,.back()获得字符串最后一个元素;.pop_back()删除字符串最后一个元素;push_back()字符串尾部添加元素

3.代码

1.方法一

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char>input;
        for(int i=0;i<s.size();i++)
        { 
            if(input.empty())input.push(s[i]);
            else
            {
             if(input.top()!=s[i]) input.push(s[i]);
             else input.pop();
            }
        }
            int count=input.size()-1;
            s.clear();
            while(!input.empty())
            {
                s+=input.top();//string的输入用法
                input.pop();
            }
           reverse(s.begin(),s.end());
   return s;
    }
};

2.方法二

class Solution {
public:
string result;//直接用字符串当成栈
    string removeDuplicates(string s) {
        int size=s.length();
        for(int i=0;i<size;i++)
        {
            if(!result.empty())
            {
                if(result.back()==s[i]) result.pop_back();
                else result.push_back(s[i]);
             
            }
            else result.push_back(s[i]);
        }
        return result;
        }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值