leetcode刷题_栈相关_c++版

(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();
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44343355/article/details/132865324
今日推荐