栈
1·栈的基础知识
栈是一种常用的数据结构,它的最大特点是"FILO"先入后出
1·1栈在C++当中常用的操作
#include <iostream>
#include "stack"
using namespace std;
int main(){
stack<string>s;
//入栈
s.emplace("ch");
//返回栈顶元素
string x=s.top();
//出栈
s.pop();
return 0;
}
剑指 Offer II 036. 后缀表达式
分析
后缀表达式时一种算术表达式,它的操作符在操作数的后面
以题目当中的例子我们一起走一下整个过程
从左到右扫描这个数组。首先我们遇到的是操作数2,由于这是后缀表达式,操作符还在后面。不知道操作符就不能够计算,所以先将2保存到栈中。接下来式1这个操作数,我们将其保存到栈中,之后我们遇到了"+“是操作符,我们已经知道如何计算了,那么前两个数字分别出栈,然后进行运算,2+1=3,结果完成之后,我们再将其结果入栈,之后我们遇到了操作数3我们将其入栈,最后我们遇到了操作符”*"我们知道怎么运算,那么我们将其中两个数字出栈3 *3=9,将这个元素保存起来返回就OK
代码
class Solution {
private:
//定义一个函数来进行加减乘除运算
int calculate(int num1,int num2,string s){
if(s=="+")
return num1+num2;
else if(s=="-")
return num1-num2;
else if(s=="*")
return num1*num2;
else if(s=="/")
return num1/num2;
else
return 0;
}
public:
int evalRPN(vector<string>& tokens) {
stack<int>Stack;
//循环遍历整个数组
for(string c:tokens){
//如果遇到数字操作符那么就进行计算,否则就进行入栈操作
if(c=="+"||c=="-"||c=="*"||c=="/"){
int num1=Stack.top();
Stack.pop();
int num2=Stack.top();
Stack.pop();
Stack.push(calculate(num2,num1,c));
}else{
//stoi函数是将字符串转为10进制的zheng'shu
Stack.push(stoi(c));
}
}
return Stack.top();
}
};
剑指 Offer II 037. 小行星碰撞
分析:
-
如果一个小行星向右飞行,那么它可以入栈,如果一个小行星向左飞行,而位于栈顶的小行星向右飞行,那么它将与位于栈顶的小行星相撞。
-
如果位于栈顶的小行星较小则爆炸消失即出栈。然后继续判断它是否将与下一颗小行星相撞,如果它与所有小行星相撞没有爆炸消失,那么它将入栈
class Solution {
public:
vector<int> asteroidCollision(vector<int>& asteroids) {
stack<int>tack;
for(auto x:asteroids){
//当栈不为空并且栈顶元素大于0的时候,同时栈顶的元素小于向左飞行的元素的相反数的时候,栈顶元素出栈
while(!tack.empty()&&tack.top()>0&&tack.top()<-x){
tack.pop();
}
//如果两个元素相等的时候,出栈
if(!tack.empty()&&x<0&&tack.top()==-x){
tack.pop();
//如果栈顶元素大于0,或者栈为空,或者栈顶元素小于0的时候都直接入栈
}else if(x>0||tack.empty()||tack.top()<0){
tack.push(x);
}
}
vector<int>arr;
while(!tack.empty()){
arr.push_back(tack.top());
tack.pop();
}
reverse(arr.begin(), arr.end());
return arr;
}
};
剑指 Offer II 038. 每日温度
分析:
对于数组的每个温度,可以它后面的每个温度直到发现一个更高的温度为止。如果数组包含n天的温度,那么这种思路的时间复杂度为0(n^2)
-
假设输入的表示每天的温度数组为[35.31,33.36,34],第一天的温度为35,此时不知道后面会不会有对应更高的温度,所以先将它保存到一个数据容器中。第2天的温度是31度比第一天的温度低,同样也保存到容器中。第3天的温度为33,比第二天的温度高,由此可知,第2天需要等1天才有更高的温度
class Solution { public: vector<int> dailyTemperatures(vector<int>& temperatures) { //因为数组在一开始就要分配内存空间,所以先获取数组的长度然后顶一个新的数组 int n=temperatures.size(); //定义一个栈 vector<int>ans(n); stack<int>t; for(int i=0;i<temperatures.size();i++){ //如果栈不为空同时第i天的温度大于栈顶那天的温度的时候 while(!t.empty()&&temperatures[i]>temperatures[t.top()]){ //记录栈顶的元素值 int prev=t.top(); //出栈 t.pop(); //比第i天温度高的是 第i天减去-prev ans[prev]=i-prev; } //将 t.push(i); } return ans; } };