代码随想录Day9:栈和队列

1.栈

栈遵循先入后出的原则。

函数:

        stack.pop();//出栈,弹出最上层的元素,但是返回值为空

        stack.top();//返回最上层的元素的值。 

        stack.push(Type x);//将元素x入栈

        stack.empty();//判断这个栈是否为空

        stack.size();//返回这个栈的长度。

2.队列

队列遵循先入先出的原则。

函数:

        queue.pop();//出队列,弹出最前面的元素,但返回值为空

        queue.front();//返回最前面的元素的值。

        queue.back();//返回最后面的元素的值。

        queue.empty();queue.size();//类似于前面的栈

3.用栈实现队列

思路:用两个栈实现队列。

方法:对于入栈来说,直接放入stdIn中,对于出栈来说,我们先判断这个stdOut这个栈是不是空,如果不为空,直接输出最上面那个元素,如果为空,那么就将stdIn中的元素全部倒入到stdOut中,然后输出最上面的元素。

class MyQueue {
public:
    stack<int> stdIn;
    stack<int> stdOut;
    MyQueue() {
        
    }
    
    void push(int x) {
        stdIn.push(x);
    }
    
    int pop() {
        if(stdOut.empty()){
            while(!stdIn.empty()){
                stdOut.push(stdIn.top());
                stdIn.pop();
            }
        }
        int result = stdOut.top();
        stdOut.pop();
        return result;
    }
    
    int peek() {
        if(stdOut.empty()){
            while(!stdIn.empty()){
                stdOut.push(stdIn.top());
                stdIn.pop();
            }
        }
        return stdOut.top();
    }
    
    bool empty() {
        if(stdIn.empty()&&stdOut.empty()){
            return true;
        }else{
            return false;
        }
    }
};

/**
 * 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();
 */

4.用队列实现栈

思路:使用一个队列来实现栈。

实现:入栈等同。

            出栈的时候,将出队列的元素重新又压入队列同时进行类似于循环队列,我们只需要将需要的那元素放到队列最前方再出队列即可,那么此时移动的次数正好就是队列的长度-1(queue.size()-1)。从而实现出栈。

        由于队列可以获得两端的值,所以对于栈来说的栈顶元素实际上是队列的最后一个,直接用queue.back()即可获取。

注释中使用的是两个队列来完成入栈和出栈,对于出栈的时候,我们先将出队列的元素存放到另外一个队列中,然后留下最后一个,出队列即为我们需要的那个元素,然后将另外一个队列的元素重新压回队列,并清除另外一个队列里面的元素(保证代码的一致性,如果你不重新压回去的话,你下次就不知道到底是向哪一个队列入栈,哪一个队列出栈)。

class MyStack {
public:
/*
    queue<int> stdIn;
    queue<int> stdOut;
    MyStack() {

    }
    
    void push(int x) {
        stdIn.push(x);
    }
    
    int pop() {
        int size = stdIn.size();
        while(--size){
            stdOut.push(stdIn.front());
            stdIn.pop();
        }
        int result = stdIn.front();
        stdIn.pop();
        stdIn = stdOut;
        while(!stdOut.empty()){
            stdOut.pop();
        }
        return result;
    }
    
    int top() {
        return stdIn.back();
    }
    
    bool empty() {
        return stdIn.empty();
    }*/
    queue<int> queue;
    MyStack() {

    }
    
    void push(int x) {
        queue.push(x);
    }
    
    int pop() {
        int size = queue.size();
        while(--size){
            queue.push(queue.front());
            queue.pop();
        }
        int result = queue.front();
        queue.pop();
        return result;
    }
    
    int top() {
        return queue.back();
    }
    
    bool empty() {
        return queue.empty();
    }
};

/**
 * 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();
 */

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值