leetcode——栈总结

一、实现代码

#include <iostream>
#define MAXSIZE 100
using namespace std;

struct stack {
    int* base;
    int* top;
    int stacksize;
    stack() { base = new int[MAXSIZE]; top = base; stacksize = MAXSIZE; }
    //压入——top所指位置赋值,top++
    int push(int elem) {
        if (top - base == stacksize)
            return -1;
        else {
            *top = elem;
            top++;
        }
    }
    //弹出——top--
    int pop() {
        if (top == base)
            return -1;
        else
            top--;
    }
    //获取栈顶——获取top-1的元素
    int Top() {
        if (top == base)
            return -1;
        else
            return *(top - 1);
        
    }
    //判断是否栈空
    int empty() {
        if (top == base)
            return 1;
        else
            return 0;
    }
    //获取栈大小
    int size() {
        return top - base;
    }
    
};


int main() {
    //1、申请栈
    stack s;
    //2、压入元素
    s.push(5);
    s.push(2);
    s.push(0);
    //3、获取栈的大小
    cout << "The length of stack is:" << s.size() << '\n';
    //4、弹出栈
    while (!s.empty()) {
        cout << s.Top() << '\t'; s.pop();
    }
}

二、高频题目

232. 用栈实现队列——两个栈,取栈底,取完恢复
0、申请两个栈stack1,stack2
1、压入——压入stack1
2、弹出——取stack1栈底,弹出stack2栈顶,取完剩余元素放回stack1
3、取栈顶——取stack1栈顶,取完全部元素放回stack1
4、判空——stack1 stack2同时为空

150. 逆波兰表达式求值——栈解决问题
1、遇到数字直接压入栈
2、遇到符号,取出栈顶两个元素,进行运算,并将结果压入
3、返回栈顶,即运算结果

20. 有效的括号——栈解决问题
1、遇到左括号直接压入
2、栈当前为空 证明无左括号与接下来的右括号匹配 直接返回false
3、遇到右括号,判断栈顶是否为对应的左括号,是则弹出,否则返回false

1472. 设计浏览器历史记录——两个栈解决,向量模拟栈解决(更快)
1、申请vector和一个top指针模拟栈
2、压入——cur指针前移,top指针更新,判断cur是否超出stack的存储大小
3、后退——cur取 0 与 cur-steps的较小值
4、前进——cur取 top 与 cur+steps的较大值

1209. 删除字符串中的所有相邻重复项 II——两个栈解决
0、 一个存储字母letter,一个存储相同字母的连续出现次数count
1、当前元素与栈顶相同,连续出现次数+1,判断是否等于k
( 1.1、等于则弹出 1.2、不等则插入)
2、当前元素与栈顶不相同,元素插入letter,1插入count

1249. 移除无效的括号——一个符号栈sign,一个stirng ans
1、遍历字符串,遇到左括号入栈,加入ans
2、遇到右括号,判断栈有无左括号进行匹配,有则弹出左括号,加入ans
3、遇到字母,直接加入ans
4、获取sign的size,为0则直接返回ans,否则进行逆序左括号删除
(逆序左括号删除可以保证迭代器不失效,且左括号无论出现再开头还是结尾都可正确被删除)

735. 行星碰撞——栈解决问题
1、遇到正数直接入栈
2、遇到负数不发生碰撞——栈为空 或 stack.top()<0
3、遇到负数发生碰撞——stack.top()>0
3.1、item大于top,stack.pop()——item大于/等于/小于top,不发生碰撞
3.2、item等于top,stack.pop()
3.3、item小于top,直接不处理
4、stack转vector再反转

224. 基本计算器——利用栈处理括号,ops.push(1),sign=1
1、跳过空格
2、遇到+/-,更新当前数字的符号,(+/-)*sign.top();
3、遇到‘(’,ops.push(sign)
4、遇到’)’,ops.pop()
5、遇到数字进行整合,ans+=sign x num
6、返回ans

三、思考与收获

1、何时使用栈?
1)括号匹配题
2)中间元素不断被消除
3)重复相邻元素
4)表达式求值

2、使用栈需要注意什么?
注意栈为空的时候,不能进行top pop的操作
循环不断pop的操作,循环条件一定要记得判 !stack.empty()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值