栈,队列的操作

文章详细介绍了如何使用两个栈来模拟队列的操作,以及如何使用两个队列来实现栈的功能。在栈变队列的过程中,通过将栈中元素转移到另一个栈来实现FIFO(先进先出),而在队列变栈时,利用队列的特性,将所有元素出队再入队,达到LIFO(后进先出)的效果。此外,还提到了单个队列实现栈的策略,通过获取队列大小并调整顺序来获取栈底元素。
摘要由CSDN通过智能技术生成

使用栈来组成队列

stack

232. 用栈实现队列

脑壳里去模拟一下栈的操作,先入先出。

1.添加元素直接push就可以。

2.pop出栈操作,就会复杂一点,我们现在需要的是移除并且返回栈底的最后一个元素,我们需要将门前栈前面的n-1个元素全部放入一个新的栈中,通过循环size--来找到最后一个元素,记录最后一个元素并且不将这个元素放入辅助栈,然后将辅助栈的元素放回原来的正确的栈中。

3.获取队头元素,使用已有的pop函数,弹出,再push放入。

class MyQueue {
public:
    stack<int> stIn;
    stack<int> stOut;
    MyQueue() {

    }
    
    void push(int x) {//队列尾端怎加元素x
        stIn.push(x);
    }
    
    int pop() {//出队列操作,移除+返回元素
        //当stOut为空是,才能从stIn中导入数据,导入stin中的全部数据
        if(stOut.empty()){
            while(!stIn.empty()){
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        int result = stOut.top();
        stOut.pop();
        return result;
    }
    
    int peek() {//返回队列开头的元素
        int res = this->pop();
        stOut.push(res);
        return res;
    }
    
    bool empty() {//队列的判空操作,如果为空true,不空false
        return stIn.empty()&&stOut.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();
 */

使用队列来实现栈

使用两个队列来实现栈

代码注释很清晰,望理解!

class MyStack {
public:
    queue<int> que1;
    queue<int> que2;//辅助队列
    //由于我们目前使用两个队列来实现栈,队列讲究一个先入先出的序列,而我们的栈为后入先出,
    //所以我们定义两个队列,用来备份出栈操作时候的数据,保存起来,
    //再成功出栈并且记录数值后再来将备份后的数据重新添加到原队列。
    
    MyStack() {
        //栈嘛,就是先入先出的一种东西,
    }
    
    void push(int x) {//将元素放入栈顶
        que1.push(x);
    }
    
    int pop() {//移除栈顶元素,并且保存这个值,返回回来,(出栈操作记录值)
        int size = que1.size();
        size --;//非常刻意的队列中留下一个元素作为保留!!!!!!!细节
        while(size--){//循环将que1的数据导入que2中
            que2.push(que1.front());//返回第一个元素
            que1.pop();
        }
        int result = que1.front();//此处留下的最后一个元素。
        que1.pop();//将最后一个元素也弄完
        que1 = que2;
        while (!que2.empty()){//循环清空que2
            que2.pop();
        }
        return  result;
    }
    
    int top() {//不移除元素,只返回这个值
        return que1.back();
    }
    
    bool empty() {//判空操作
        return que1.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();
 */

在实现过程中发现一个问题

front和back方法的使用不同之处。

a.front();返回的是第一个元素的引用。
a.back();返回的的是最后一个元素的引用。

back是取值操作,而front是对于最后一个地址的操作

挂个学习链接C++STL的vector中front(),back(),begin(),end()的用法_vector的front_寒泉Hq的博客-CSDN博客front()返回的的确是第一个元素的引用。但是你定义的b并不是一个引用,操作b不会对a中的元素造成影响。若定义int &amp;amp;amp;b=a.front();则对b的操作会影响a中第一个元素。..._vector的fronthttps://blog.csdn.net/sinat_42483341/article/details/87465982

使用一个队列来实现栈

使用一个队列来实现,主要方法为获取队列大小,然后将队列出栈的元素重新从队尾来加进去,获取最后一个元素,来实现栈!!!!!

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

    }
    
    void push(int x) {
        que.push(x);
    }
    
    int pop() {
        int size = que.size();
        size --;//有心计的保留一位元素
        while(size--){
            que.push(que.front());
            que.pop();
        }
        int result = que.front();//这里弹出的元素就是栈底的元素了
        que.pop();
        return result;
    }
    
    int top() {
        return que.back();
    }
    
    bool empty() {
        return que.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();
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值