天池训练营链接
最小栈
参考题解
建辅助栈,push的时候存储对应时间当前栈的最小值。
class MinStack {
stack<int> s;
stack<int> min_s;
public:
MinStack() {
min_s.push(INT_MAX);
//push操作里面要比较
}
void push(int val) {
s.push(val);
min_s.push(min(val, min_s.top()));
}
void pop() {
s.pop();
min_s.pop();
}
int top() {
return s.top();
}
int getMin() {
return min_s.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
比较含退格的字符串
个人解答:
用例"a##c"
"#a#c"报错Process finished with exit code 139 (interrupted by signal 11: SIGSEGV),应该是越界
class Solution {
public:
bool backspaceCompare(string s, string t) {
stack<char> s1,s2;
for(int i=0;i<s.size();++i){
if(s[i]!='#'){
s1.push(s[i]);
}
else{
s1.pop();
}
}
for(int j=0;j<t.size();++j){
if(t[j]!='#'){
s2.push(t[j]);
}
else{
s2.pop();
}
}
//入栈
if(s1.size()!=s2.size()){
return false;
}
while(!s1.empty()){
if(s1.top()!=s2.top()){
return false;
}
s1.pop();
s2.pop();
}
return true;
}
};
改进:s1.pop()之前先判断是否空栈,是空就不处理,非空才pop
class Solution {
public:
bool backspaceCompare(string s, string t) {
stack<char> s1,s2;
for(int i=0;i<s.size();++i){
if(s[i]!='#'){
s1.push(s[i]);
}
else{
if(!s1.empty()){
s1.pop();
}
}
}
for(int j=0;j<t.size();++j){
if(t[j]!='#'){
s2.push(t[j]);
}
else{
if(!s2.empty()){
s2.pop();
}
}
}
//入栈
if(s1.size()!=s2.size()){
return false;
}
while(!s1.empty()){
if(s1.top()!=s2.top()){
return false;
}
s1.pop();
s2.pop();
}
return true;
}
};
基本计算器II
class Solution {
public:
int calculate(string s) {
vector<int> st;
char sign='+';
int num_cur=0;
for(int i=0; i<s.size(); ++i){
//if(s[i]==' '){
// continue;
//}
//这样写会导致如果最后一堆空格,就没法将最后的结果算进去
if(isdigit(s[i])){
num_cur=num_cur*10+int(s[i]-'0');
//这里不用int做类型转换会报错
}
if(!isdigit(s[i]) && s[i]!=' ' || i==s.size()-1){
//这里是碰到下一个符号才会把前一个数字算进去,所以
//最后一个数字没有下一个符号,要把结果算进去
//空格跳过
switch(sign){
case '+':
st.push_back(num_cur);
break;
case '-':
st.push_back(-num_cur);
break;
case '*':
st.back()*=num_cur;
break;
//前面的case要带break
default:
st.back()/=num_cur;
//default不带条件和break
}
num_cur=0;
sign=s[i];
}
}
return accumulate(st.begin(), st.end(), 0);
//累加,起始是0
}
};
有效的括号
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for(auto c:s){
if(st.empty()){
st.push(c);
continue;
}
switch(c){
case ')':
if(st.top() == '(') st.pop();
else st.push(c);
break;
case ']':
if(st.top() == '[') st.pop();
else st.push(c);
break;
case '}':
if(st.top() == '{') st.pop();
else st.push(c);
break;
default:
st.push(c);
}
}
return st.empty();
}
};
逆波兰表达式求值
注意:if-else都规范写,
if
else if
else这样
写遍历用i=0 to n比c++的 auto c:string好用,因为后面可能会用到序号。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
int n=tokens.size();
stack<int> st;
for(int i=0; i<n; ++i){
if(tokens[i] == "+"){
int num1=st.top();
st.pop();
int num2=st.top();
st.pop();
st.push(num1+num2);
}
else if(tokens[i] == "-"){
int num1=st.top();
st.pop();
int num2=st.top();
st.pop();
st.push(num2-num1);
}
else if(tokens[i] == "*"){
int num1=st.top();
st.pop();
int num2=st.top();
st.pop();
st.push(num1*num2);
}
else if(tokens[i] == "/"){
int num1=st.top();
st.pop();
int num2=st.top();
st.pop();
st.push(num2/num1);
}
else{//数字就入栈
st.push(stoi(tokens[i]));
}
}
return st.top();
}
};
知识
INT_MAX
C++ pop返回的void,要调栈顶得top才行
accumulate(st.begin(), st.end(), 0)
vector.back() vector.front()