有关c++vector的pop_push和back的。
笔者摸鱼去力扣刷题,因为vector用习惯了,栈相关的操作都通过vector的pop_back(),push_back()和back()实现的,然后这是我写的面对逆波兰式的代码,运行没有问题地址
class Solution {
public:
int evalRPN(vector<string>& tokens) {
vector<int> score;
for(auto token:tokens){
if(token != "+" && token != "-" && token != "*" && token != "/"){
score.push_back(stoi(token));
}else{
int m ,n;
m = score.back();
score.pop_back();
n=score.back();
score.pop_back();
if(token == "+"){
score.push_back(n+m);
}
if(token == "-"){
score.push_back(n-m);
}
if(token == "*"){
score.push_back(n*m);
}
if(token == "/"){
score.push_back(n/m);
}
}
}
return score.back();
}
};
但是后续做到一个用栈处理计数器的题目地址,使用相同的思路,在设计好括号内加减问题后,运行却出现了错误,我也知道这个方向有问题,难以处理带负号情况,可我想知道的是为什么这一次的代码执行过程,当while循环中执行.back();.pop_back()使该指针数组大小为零时地址有误,而逆波兰式的算法却没有这个问题,并且如果预先为计数器的 temp指针数组提前放置一个元素0使.back();.pop_back()后指针数组大小不为零就不会爆相关的错误。

class Solution {
public:
int calculate(string s) {
vector<int> temp;
vector<char> flags;
for(auto m:s){
if(m == ' ' || m == '"'){continue;}
if(m != '+' && m != '-' && m != '(' && m != ')'){
temp.push_back((int)m-48);
}else if(m == ')'){
flags.push_back(m);
while(flags.back() != '('){
flags.pop_back();
int k = temp.back();
temp.pop_back();
int i = temp.back();
temp.pop_back();
if(flags.back() == '+'){
temp.push_back(k+i);
continue;
}else if(flags.back() == '-'){
temp.push_back(k-i);
continue;
}
}
}else{
flags.push_back(m);
}
}
return temp.back();
}
};