leetcode刷题_栈相关_c++版

news2025/1/20 11:00:27

(1)225用栈实现队列–简单

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

在这里插入图片描述

class MyStack {
public:
    MyStack() {

    }
    //push用临时队列实现,要push的元素先放到临时队列的队头,再把队中原有的后续元素接入到后面。
    void push(int x) {
        if(queue1.empty()) {
            queue1.push(x);
            return;
        }
        std::queue<int> queue_tmp;
        queue_tmp.push(x);
        while( !queue1.empty() ){
            int x = queue1.front();
            queue1.pop();
            queue_tmp.push(x);
        }
        while( !queue_tmp.empty()){
            int x = queue_tmp.front();
            queue_tmp.pop();
            queue1.push(x);
        }
    }
    
    int pop() {
        int x = queue1.front();
        queue1.pop();
        return x;
    }
    
    int top() {
        return queue1.front();
    }
    
    bool empty() {
        return queue1.empty();
    }
private:
    std::queue<int> queue1;
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

在这里插入图片描述

(2)232用栈实现队列–简单

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:

你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
在这里插入图片描述

class MyQueue {
private:
    stack<int> _data;

public:
    
    MyQueue() {

    }
    
    void push(int x) {
        if(_data.empty()) {
            _data.push(x);
            return;
        }
        //临时栈,要插入的元素先放入临时栈
        std::stack<int> temp_stack;
		//
        while( !_data.empty() ){
            int i = _data.top();
            temp_stack.push(i);
            _data.pop();
        }
        //最后插入的元素放在临时栈顶
        temp_stack.push(x);
        //将临时栈转换到原来的栈,栈顶元素变到栈低
        while(!temp_stack.empty()){
            int i = temp_stack.top();
            _data.push(i);
            temp_stack.pop();
        }
        
    }
    
    int pop() {

        int x = _data.top();
        _data.pop();
        return x;
    }
    
    int peek() {
        return _data.top();
    }
    
    bool empty() {
        return _data.empty();
    }


};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

在这里插入图片描述

(3)155最小栈–中等

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
在这里插入图片描述

class MinStack {
private:
//用一个临时最小值栈记录各个元素为栈顶时的最小值,与data栈同步
    stack<int> record_min;
    stack<int> _data;

public:

    MinStack() {

    }
    
    void push(int val) {
        if(_data.empty()) {
            _data.push(val);
            record_min.push(val);
            return;
        }
        _data.push(val);
        int x = record_min.top();
        if(val<x) record_min.push(val);
        else record_min.push(x);
        
    }
    
    void pop() {
        _data.pop();
        record_min.pop();
    }
    
    int top() {
        return _data.top();
    }
    
    int getMin() {
        return record_min.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();
 */

在这里插入图片描述

(4)224基本计算器–困难

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
在这里插入图片描述

#include<iostream>
#include <string>
#include <sstream>
using namespace std;
class Solution {
private:
    stack<int> number_stack;
    stack<int> op_stack;
public:
    int cal(int a, int b ,char op){
        if(op == 43) {
            //cout<< " "<< a << "+" << b ;//<< endl;
            return (a + b);
        }
        else if(op == 45) {  
            //cout<< " "<< a << "-" << b ;//<< endl;
            return (a - b);
        }
        return 0;
    }

    int calculate(string s) {
        //仅有一个数字
        //cout<< s.length() << endl;
        if(s.length()<=2) {
            int tmp;
            stringstream ss;
            ss << s[0];
            ss >> tmp;
            return tmp;
        }
        int a;
        int b;
        int calculateMark = 0;
        int numberMark = 0;//标志连续输入了几个数字,连续输入的数字被合并成一个数字
        int beginFlag1 = 1;//起始输入flag1为1
        int beginFlag2 = 0;//前括号后的输入flag2为1
        for(int i = 0; i<s.length(); i++){
            if(i > 0) beginFlag1 = 0;
            //cout<< "s[i] = " << s[i] ;//<< endl;
            if(s[i] == 32) {
                //cout<< "SPACE continue" << endl;
                continue;
            }

            //如果是数字
            else if(s[i]<=57&&s[i]>=48){
                //如果可以计算了
                beginFlag1 = 0;
                beginFlag2 = 0;
                //cout << " " << i <<" numberMark="<< numberMark;
                if(numberMark == 0){
                    //前面没有已经输入的数字(非连续输入的数字),直接push
                    int tmp;
                    stringstream ss;
                    ss << s[i];
                    ss >> tmp;
                    number_stack.push(tmp);
                    numberMark += 1;//已经输入了一个数字
                    //cout<< " pushed" << endl;
                }
                else{
                    a = number_stack.top();
                    //cout <<" a= "<< a;
                    number_stack.pop();
                    string tmp;
                    //判断+或-
                    stringstream ss;
                    ss << a;
                    ss >> tmp;
                    //cout << " " << tmp <<"->" ;
                    tmp = tmp+s[i];//与前面的字符串合并
                    //cout<<tmp;
                    int c;
                    //同一stream进行多次转换应调用成员函数clear
                    ss.clear();
                    ss << tmp;
                    ss >> c;
                    number_stack.push(c);//重新push到栈中
                    //cout << " " << c << "pushed "<< endl;

                }
                
            }
            //如果是前括号,直接push,calculateMark置0
            else if(s[i] == 40) {
                op_stack.push(s[i]);
                calculateMark = 0;
                numberMark = 0;
                //cout<< " pushed level_flag=" << level_flag << " pushed" << endl;
                beginFlag2 = 1;
                //level.push(level_flag);
                //level_flag = 0;
                
            }

            //如果是后括号
            else if(s[i] == 41){
                numberMark = 0;
                beginFlag2 = 0;
                //如果括号内有可计算的表达式
                if(op_stack.top() != 40){
                        //计算括号内的表达式
                    b = number_stack.top();
                    number_stack.pop();
                    a = number_stack.top();
                    number_stack.pop();
                    //判断+或-
                    //cout << " a="<< a<< " b="<<b <<" op="<< op_stack.top()<<" ";
                    
                    number_stack.push(cal(a, b, op_stack.top()));
                    op_stack.pop();
                    //calculateMark = 0;
                    //cout<< " "<< op_stack.top() << " poped " << endl ;
                }
                
                op_stack.pop();//弹出前括号
                //如果符号栈非空
                if( !op_stack.empty() && (!(op_stack.top() == 40))) calculateMark = 1;
                else calculateMark = 0;
                
            }
            //如果是其它符号(加或者减),push,calculateMark置1
            else {
                //如果未输入数字就输入加或减,会被认为是数符
                if( beginFlag1 || beginFlag2 ){
                    //cout<< " " <<s[i+1] << "->" ;
                    number_stack.push(0);
                    op_stack.push(s[i]);

                    calculateMark = 1;
                    numberMark = 0;
                    beginFlag2 = 0;
                    
                }
                //如果运算标识符为1,表示前面已经有表达式可以计算了,计算完再push当前运算符
                //运算标识符不变
                
                else if (calculateMark == 1){
                    b = number_stack.top();
                    number_stack.pop();
                    a = number_stack.top();
                    number_stack.pop();
                    
                    //cout << " a="<< a<< " b="<<b <<" op="<< op_stack.top()<<" ";
                    //std::istringstream(s[i]) >> tmp;
                    //cout<< " "<< a << op_stack.top() << tmp << endl;
                    //判断+或-
                    number_stack.push(cal(a, b, op_stack.top()));
                    op_stack.pop();
                    op_stack.push(s[i]);
                    calculateMark = 1;
                    //cout<< " pushed" ;//<< endl;
                    numberMark = 0;
                    
                }
                //如果运算标识符为0,表示前面没表达式可以计算直接push当前运算符
                //运算标识符置1
                else {
                    op_stack.push(s[i]);
                    calculateMark = 1;
                    //cout<< " pushed" ;//<< endl;
                    numberMark = 0;
                }
                
                //cout << " calculateMark ="<< calculateMark<<" "<< endl;
            }
                
        }
        if( !op_stack.empty() ){
            b = number_stack.top();
            number_stack.pop();
            a = number_stack.top();
            number_stack.pop();
            
            //cout << " a="<< a<< " b="<<b <<" op="<< op_stack.top()<<" ";
            //std::istringstream(s[i]) >> tmp;
            //cout<< " "<< a << op_stack.top() << tmp << endl;
            //判断+或-
            number_stack.push(cal(a, b, op_stack.top()));
        }
        return number_stack.top();
    }
};

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1007518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

任务长期不释放和占用单节点持续的cpu,导致hivesever2本身内存泄漏造成

任务长期不释放和占用单节点持续的cpu&#xff0c;导致hivesever2本身内存泄漏造成 产生的原因在于&#xff1a; 查询过于复杂或者数据量过大&#xff1a;当有复杂的查询或处理大量数据的请求时&#xff0c;HiveServer2可能会出现高负载。这可能涉及大量的计算、IO操作或涉及大…

支付宝小程序排名优化,一个小白的成长手记

那是一个风和日丽的周末早上,阳光透过窗帘洒进屋内,温暖了我的双脚。这是我加入新公司的第一个周末,我坐在桌前,满怀激情地准备开发我的第一个支付宝小程序。【名即薇】 经过两天两夜的奋战,我终于完成了一个初版的支付宝小程序。是一个集美食资讯、餐厅点评、外卖订餐于一体的…

Springboot整合整合Swagger3

常用注解 Api&#xff1a;用在请求的类上&#xff0c;表示对类的说明 tags“说明该类的作用&#xff0c;可以在UI界面上看到的注解”value“该参数没什么意义&#xff0c;在UI界面上也看到&#xff0c;所以不需要配置” ApiOperation&#xff1a;用在请求的方法上&#xff0c;…

【嵌入式】化繁为简 UART、I2C、SPI整理

本文参考&#xff1a;浅谈单片机通信&#xff0c;化繁为简UART、I2C、SPI学习全家桶&#xff0c;你值得拥有&#xff01;_哔哩哔哩_bilibili 单片机的数据都是以0、1发送的&#xff0c;每一位发送多少时间取决于波特率 。 波特率是发送二进制数据位的速率&#xff0c;单位是b…

认识数据分析

文章目录 1. 认识数据分析1.1 数据自身的三大属性1.2 建数仓 数据分析的工程技术1.3 数据分析解决问题的原理1.4 数据分析的具体流程1.5 数据的中心化和智能化1.6 数据分析的四种类型和六个方向 1. 认识数据分析 1.1 数据自身的三大属性 客观&#xff1a;用数字衡量和表现一件…

vue2+three.js+blender(实现3d 模型引入并可点击效果)

2023.9.13今天我学习了如何把3d建模里面的模型引入到vue中&#xff0c;并可以实现拖动&#xff0c;点击的效果&#xff1a; 首先安装&#xff1a; npm install three 相关代码如下&#xff1a; <!--3d基础版&#xff0c;实现单个3d图形--> <template><div>&…

【服务器】ASUS ESC4000-E11 安装系统

ASUS ESC4000-E11说明书 没找到 ASUS ESC4000-E11的说明书&#xff0c;下面是ESC4000A-E11的说明书&#xff1a; https://manualzz.com/doc/65032674/asus-esc4000a-e11-servers-and-workstation-user-manual 下载地址&#xff1a; https://www.manualslib.com/manual/231379…

【PTA】PAT(甲级)2022年冬季考试自测

个人学习记录&#xff0c;代码难免不尽人意。 这次考试&#xff0c;e&#xff0c;第一题我看好多人都没理解题意做错了&#xff0c;还有第四题真的是比较意外&#xff0c;之前做的题都是给序列建树&#xff0c;但是这次让判断是否可以生成树&#xff0c;之前从来没有遇到过这类…

leecode 每日一题 2596. 检查骑士巡视方案

2596. 检查骑士巡视方案 骑士在一张 n x n 的棋盘上巡视。在 有效 的巡视方案中&#xff0c;骑士会从棋盘的 左上角 出发&#xff0c;并且访问棋盘上的每个格子 恰好一次 。 给你一个 n x n 的整数矩阵 grid &#xff0c;由范围 [0, n * n - 1] 内的不同整数组成&#xff0c;其…

pyechart练习(一):画图小练习

1、使用Map制作全球人口分布图 import math import osimport matplotlib.pyplot as plt from pyecharts.charts import Map from pyecharts import options as opts# 只有部分国家的人口数据 POPULATION [["China", 1420062022], ["India", 1368737513],…

【C++】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 )

文章目录 一、拷贝构造函数概念二、对象值作为函数参数1、拷贝构造函数调用情况说明2、代码示例 - 对象值作为函数参数 三、对象值作为函数返回值1、拷贝构造函数调用情况说明2、代码示例 - 对象值作为函数返回值 博客总结 : " 拷贝构造函数 " 又称为 " 赋值构…

MySQL之分布式事务

写在前面 当数据库进行了分库分表 之后为了保证数据的一致性。不可变的就需要引入跨数据的事务解决方案&#xff0c;这种解决方案我们叫做分布式事务。本文就一起来看下分布式事务相关的内容。 在8.0 版本上学习。 1&#xff1a;实战 为了能够更好的理解理论知识&#xff0c;…

基于SSM的中小型企业财务管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

C++项目实战——基于多设计模式下的同步异步日志系统-②-前置知识补充-不定参函数

文章目录 专栏导读不定参函数C风格不定参函数不定参宏函数 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿里云专家博主&#xff0c;CSDN内容合伙人…致力于 C/C、Linux 学…

数据分析三剑客之Matplotlib

0.Matplotlib绘图和可视化 1.简介 我的前面两篇文章介绍了 Nimpy &#xff0c;Pandas 。今天来介绍一下Matplotlib。 简单来说&#xff0c;Matplotlib 是 Python 的一个绘图库。它包含了大量的工具&#xff0c;你可以使用这些工具创建各种图形&#xff0c;包括简单的散点图&…

Java多线程并发面试题

文章目录 Java并发基础并行和并发有什么区别&#xff1f;说说什么是进程和线程&#xff1f;Java线程创建方式&#xff1f;Runnable和Callable接口的区别&#xff1f;为什么调用start()方法时会执行run()方法&#xff0c;不直接调用run()方法&#xff1f;sleep()和wait()的区别&…

预约陪诊就诊小程序源码多城市开发版

陪诊小程序多城市版开发 小程序支持多城市开通&#xff0c;支持创建陪诊团队以及提成奖励设置&#xff0c;可以定义多种服务类型&#xff0c;订单流程简单明了&#xff0c;支持陪诊师手机端订单处理&#xff0c;家政类目可以轻松过审。 小程序市场前景&#xff1a; 人口老龄化…

强大:dynamsoft-barcode-reader-dotnet-9.6.30 Crack

dynamsoft-barcode-reader-dotnet 具有灵活 API 的强大条码扫描器 SDK 无论它是扭曲的、黑暗的、遥远的、模糊的、批量的还是移动的&#xff0c;我们都可以扫描它。速度快 条码扫描速度每分钟500 业界最快的扫描解码&#xff0c;可应用于不同场景&#xff1a; 多个条形码/二维…

【VS2022】调试

F9 创建或取消断点 ctrlF9 禁用断点 F5 开始调试&#xff08;到断点处停下来&#xff09; F10 逐过程&#xff08;不进入函数&#xff09; F11 逐语句 F5、F10、F11都可以直接进入调试 【调试】->【窗口】->【监视】&#xff0c;输入变量就可以观察到变量的值。 …

C语言数组和指针笔试题(二)(一定要看)

目录 字符数组二例题1例题2例题3例题4例题5例题6例题7总结 字符数组三例题1例题2例题3例题4例题5例题6例题7 字符数组二 char arr[] {a,b,c,d,e,f} 1:printf("%d\n", strlen(arr)); 2:printf("%d\n", strlen(arr0)); 3:printf("%d\n", strlen(…