训练营day10 栈和队列基础

本文介绍了如何在C++中使用栈和队列实现LeetCode中的队列和栈数据结构,包括基本操作如push、pop、top等,以及如何用一个队列模拟栈和两个队列实现栈的操作原理。
摘要由CSDN通过智能技术生成

栈和队列基础:

1)队列。队列是一种先进先出的数据类型。c++调用的话,需要添加头文件<queue>

     定义方式  queue<int> xx;

基本操作:push() 入队,在队尾添加元素,无返回值。

                  pop()  出队,将队列头元素删除(出队),无返回值

                   front() 获取队列头部元素。返回头部元素的值

                   size()  获取队列大小

                   empt() 判断队列是否为空

                   back() 返回队列尾部元素

2)栈。栈是先进后出的数据类型,调用需要<stack>

         定义方式  stack<int> xx;

基本操作:push() 入栈,在栈顶端添加元素,无返回值

                  pop() 出栈,将栈顶元素删除,无返回值

                  top() 返回栈顶的元素

                  size() 获得栈的大小。

                   empty()  判断栈是否为空。空返回true ,非空返回 false

题目:232. 用栈实现队列 - 力扣(LeetCode)

class MyQueue {
public:
    stack<int> _stack_in;
    stack<int> _stack_out;
    MyQueue() {
       
    }
    
    void push(int x) {
        _stack_in.push(x); // push就将数据压入大数据进入栈即可
    }
    
    int pop() {  // pop是要返回最先进栈的数据,就用另一个出栈来存,
                 // 出栈存的就是队列的顺序了,这里要注意只有出栈空的时候才将
                // 进栈的数据放入出栈
        if(_stack_out.empty()) {
            while(!_stack_in.empty()) {
            int tmp = _stack_in.top();
            _stack_in.pop();
            _stack_out.push(tmp);
            }
        }
        int reslut = _stack_out.top();
        _stack_out.pop();
        return reslut;
    }
    
    int peek() { // 这个可以直接调用pop函数就行,最后将该数据再push进出栈就行
        int reslut = this->pop();
        _stack_out.push(reslut);
        return reslut;
    }
    
    bool empty() { // 出栈和进栈都空才行,这里 .empty() 空返回true
        if(_stack_out.empty() && _stack_in.empty()) return true;
        else return false;
    }
};

题目:225. 用队列实现栈 - 力扣(LeetCode)

这道题用两个队列实现栈,主要思路就是将队列1里除了最后一个元素全部 push 到队列2 并 pop 这些元素,然后返回最后一个元素即实现了栈里的top ,如果再将这个元素pop掉就实现了  栈的pop操作,不过这里需要注意一点,当完成这些操作之后,需要将队列2再赋值给队列1,然后清空队列2,否则先 pop 再 top就出错了。代码附下:

class MyStack {
public:
    queue<int> inqueue;
    queue<int> outqueue;
    MyStack() {

    }
    
    void push(int x) {
        inqueue.push(x);
    }
    
    int pop() {
        int reslut;
        while(!inqueue.empty()) {
            if(inqueue.size() == 1) { 
                reslut = inqueue.front(); 
                inqueue.pop();
                swap(inqueue, outqueue);
                break;
            } else {
                outqueue.push(inqueue.front());
                inqueue.pop();
            }
        }
        return reslut;
    }
    
    int top() {
        int reslut = this->pop();
        this->push(reslut);
        return reslut;
    }
    
    bool empty() {
        if(inqueue.empty()) return true;
        else return false;
    }
};

卡尔的代码用一个队列实现很巧妙,其实就是主要是队列queue 由 size函数,所以可以先弹出 size-1个元素,然后再加入队列,这样原始队列最后的元素就变成了一个,我们返回再pop掉就行。至于top 函数 top就是原始队列的back。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值