栈专题-1

目录

1简介

2.例题

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

2.2比较含退格的字符串

2.3基本计算器2

2.4字符串解码

2.5验证栈序列


 

1简介

没什么好说的,主要是利用栈的思路来解决题目。不一定要用stl提供的stack,有时候自己用个数组或string来模拟,也是很方便的。

2.例题

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

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

class Solution {
public:
    string removeDuplicates(string s) {
        string ans="";
        int size=0;
        int index=0;
        int n=s.size();
        while(index<n)
        {
            if(size==0||ans[size-1]!=s[index])
            {
                ans+=s[index];
                size++;
            }
            else
            {
                ans.pop_back();
                size--;
            }
            index++;
        }
        return ans;
    }
};

2.2比较含退格的字符串

844. 比较含退格的字符串 - 力扣(LeetCode)

思路依旧是利用栈,没有太多别的内容

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        string a1,a2;
        int n1=s.size(),n2=t.size();
        int s1=0,t1=0;
        int is=0,it=0;
        while(is<n1)
        {
            if(s[is]=='#')
            {
                if(s1!=0)a1.pop_back(),s1--;
            }
            else
            {
                s1++;
                a1+=s[is];
            }
            is++;
        }
        while(it<n2)
        {
            if(t[it]=='#')
            {
                if(t1!=0)a2.pop_back(),t1--;
            }
            else
            {
                t1++;
                a2+=t[it];
            }
            it++;
        }
        if(a1!=a2)return false;
        return true;
    }
};

2.3基本计算器2

227. 基本计算器 II - 力扣(LeetCode)

class Solution {
public:
    int calculate(string s) {
        stack<int> mp;
        char op = '+';
        int tmp = 0;
        for (auto a : s) {
            if (a >= '0' && a <= '9') {
                tmp *= 10;
                tmp += (a - '0');
            } else if (a == '+' || a == '-' || a == '*' || a == '/') {
                if (op == '+') {
                    mp.push(tmp);
                    tmp = 0;
                } else if (op == '-') {
                    mp.push(-tmp);
                    tmp = 0;
                } else if (op == '*') {
                    int x = mp.top();
                    mp.pop();
                    mp.push(x * tmp);
                    tmp = 0;
                } else if (op == '/') {
                    int x = mp.top();
                    mp.pop();
                    if (tmp != 0)
                        mp.push(x / tmp);
                    tmp = 0;
                }
                op = a;
            }
        }
        if (op == '+') {
            mp.push(tmp);
            tmp = 0;
        } else if (op == '-') {
            mp.push(-tmp);
            tmp = 0;
        } else if (op == '*') {
            int x = mp.top();
            mp.pop();
            mp.push(x * tmp);
            tmp = 0;
        } else if (op == '/') {
            int x = mp.top();
            mp.pop();
            if (tmp != 0)
                mp.push(x / tmp);
            tmp = 0;
        }
        int ans = 0;
        while (!mp.empty()) {
            ans += mp.top();
            mp.pop();
        }
        return ans;
    }
};

2.4字符串解码

394. 字符串解码 - 力扣(LeetCode)

思路很清晰,就是用栈模拟。

class Solution {
public:
    string decodeString(string s) {
        stack<string> a;
        a.push("");
        stack<int> b;
        int n = s.size();
        int i = 0;
        while (i < n) {

            if (s[i] >= '0' && s[i] <= '9') {
                int x = s[i] - '0';
                i++;
                while (i < n && s[i] >= '0' && s[i] <= '9') {
                    x = x * 10 + (s[i] - '0');
                    i++;
                }
                b.push(x);
            }
            else if (s[i] == '[') {
                i++;
                string tmp = "";
                while (i < n && s[i] >= 'a' && s[i] <= 'z') {
                    tmp += s[i];
                    i++;
                }
                a.push(tmp);
            }
            else if (s[i] == ']') {
                string x = a.top();
                a.pop();
                int z = b.top();
                b.pop();
                string tmp = "";
                for (int j = 0; j < z; j++) {
                    tmp += x;
                }
                i++;
                a.top() += tmp;
            }
            else if (s[i] >= 'a' && s[i] <= 'z') {
                string tmp = "";
                while (i < n && s[i] >= 'a' && s[i] <= 'z') {
                    tmp += s[i];
                    i++;
                }
                a.top() += tmp;
            }
        }
        return a.top();
    }
};

2.5验证栈序列

946. 验证栈序列 - 力扣(LeetCode)

思路就是模拟栈的Push和Pop。不符合直接false即可

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        int shi=0,opi=0;
        stack<int>mp;
        int n=pushed.size(),m=popped.size();
        while(shi<n&&opi<m)
        {
            mp.push(pushed[shi++]);
            while (opi < m &&!mp.empty() && popped[opi] == mp.top())
            {
                mp.pop();
                opi++;
            }
        }
        if(opi==m)return true;
        return false;
    }
};

### 4G 和 5G 技术专题第二部分内容解析 #### 切换的分类及其技术实现 在无线通信网络中,切换是指移动设备从一个服务小区转移到另一个更优的服务小区的过程。对于4G和5G网络而言,其切换机制可以分为多个类别[^1]: - **4G基站内部小区的切换**:这种类型的切换发生在同一eNodeB内的不同小区之间,通常由目标小区发起切换请求并完成资源分配。 - **4G系统内部的基站间的切换**:涉及不同的eNodeBs之间的切换操作,需通过X2接口或S1接口来协调源节点与目标节点的信息交互。 - **4G与5G间异系统的切换**:这是跨制式的切换场景,在此过程中不仅需要考虑频率差异,还需要处理协议的不同以及核心网的变化等问题。 - **5G基站内部小区的切换**:类似于4G的情况,但在NR(New Radio)环境下执行,可能涉及到更高的带宽利用率和服务质量保障措施。 - **5G系统内部的基站间的切换**:利用NG-RAN架构特性来进行高效管理,确保用户体验连续性和数据传输稳定性的同时减少延迟时间。 #### 多模UE终端下的MAC层结构设计 针对支持双连接模式(Dual Connectivity, DC) 的用户设备(UE),即能够同时接入LTE (Long Term Evolution) 及NR两种无线电接入技术(RATs)[^2]: 在这种情况下,UE会维护两个独立但相互协作工作的MAC子层实例——分别服务于主组件载波(PCell) 所属的传统EUTRAN领域(MCG - Master Cell Group), 以及辅助次级单元(SCells) 归属于新型下一代新空口(NR) 领域(SCG - Secondary Cell Group). 每个MAC实体都遵循各自所属的技术标准定义的功能集,并且保持相对隔离的操作状态以便更好地适应各自的链路条件变化需求. #### 协议规范中的射频系列文档说明 关于具体的标准化文件获取途径方面提到过可以通过指定FTP服务器目录访问最新的3GPP Release版本资料集合其中包含了有关于第五代蜂窝通讯体系框架下物理层面参数设定等内容描述例如功率等级划分方法等等具体细节信息都可以查阅到相应章节部分如第2章所提及到的内容涵盖了整个高频段运作范围内的各项指标要求等重要知识点.[^3] ```python import requests def fetch_spec(version='latest'): url = f"/ftp/Specs/archive/38_series/{version}/" response = requests.get(url) if response.status_code == 200: return response.text.split('\n') raise Exception(f"Failed to retrieve specs with status {response.status_code}") specs_list = fetch_spec() print(specs_list[:5]) # Display first five entries as an example. ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值