(原)剑指offer之栈和队列

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

设两个栈为stack1,stack2;

1:首先想到最简单的方法:是入栈时将数据压入stack1,出栈时将stack1中的元素出栈压入stack2,在将stack2栈顶元素弹出,再将stack2中的剩余元素重新压入stack1,

这种方法很低效可想而知。

2:改进一下:入栈时检查stack1,如果stack1为空则元素全在stack2中,所以将stack2中的元素压入stack1中(记得检查stack2是否为空),再将元素入栈,如果stack1不为空直接将元素压入栈,同样出栈时检查stack2,如果为空将stack1中的元素压入stack2再将栈顶元素出栈,如果不为空直接将栈顶元素出栈。

方法2的c++代码实现:

class Solution
{
public:
    void push(int node) {
        if (stack1.size() != 0) stack1.push(node);
        else{
            int n = (int)stack2.size();
            for (int i = 0; i < n; i++){
                stack1.push(stack2.top());
                stack2.pop();
            }
            stack1.push(node);
        }
    }

    int pop() {
        if (stack2.size() != 0) {
            int temp = stack2.top();
            stack2.pop();
            return temp;
        }
        else {
            int n = (int)stack1.size();
            for (int i = 0; i < n - 1; i++){
                stack2.push(stack1.top());
                stack1.pop();
            }
            int temp =stack1.top();
            stack1.pop();
            return temp;
        }

    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

在网上找到一种更高效的方法:入栈时直接将元素压入stack1,出栈时检查stack2,如果为空将stack1中的元素压入stack2,如果不为空直接将stack2栈顶元素出栈,很巧妙

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }

    int pop() {
        int temp;
        if (!stack2.empty()) {
            temp = stack2.top();
            stack2.pop();
            return temp;
        }
        else {
            int n = stack1.size();
            for (int i = 0; i < n; i++){
                stack2.push(stack1.top());
                stack1.pop();
            }
            temp = stack2.top();
            stack2.pop();
            return temp;
        }
    }
时间: 2024-11-09 01:43:45

(原)剑指offer之栈和队列的相关文章

剑指Offer(栈和队列)-滑动窗口的最大值

(滑动窗口的最大值)题目描述: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}: 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2

剑指OFFER之栈的压入、弹出序列(九度OJ1366)

题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入: 每个测试案例包括3行: 第一行为1个整数n(1<=n<=100000),表示序列的长度. 第二行包含n个整数,表示栈的压入顺序. 第三行包含n个整数,表示栈的弹出顺序. 输出: 对应每个测试案例,如果第二个序列是

【剑指offer】栈的压入弹出序列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26077863 剑指offer上的第22题,九度OJ上AC. 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入: 每个测试案例包括3行: 第一行为1个整数n(

剑指offer:两个队列模拟一个栈

题目描述用两个队列来实现一个栈,完成栈的Push和Pop操作. 队列中的元素为int类型. 实现方式其实和两个栈模拟一个队列相似,但是区别在于这两个队列的作用和那两个栈的作用不一样. class Solution: """ 用两个队列模拟一个栈,如果两个队列的容量分别为M和N,其中M > N,那么模拟得到的栈的容量是N+1 因为假设先把queue1塞进N+2个,此时将元素出栈,则需要先将queue1的N+1个元素出队后压入queue2, 由于queue2的容量只有N,入

剑指Offer07-两个栈实现队列

两个栈实现队列的思路: 队列的特点是的先进先出: 栈的特点是先进后出: 将数据存入栈1,再按其输出的特点存入栈2: 这样数据最后就可以实现先进先出的特点: 代码实现: import java.util.Stack; public class No7 { public static void main(String[] args) { No7 queue = new No7(); queue.offer(1); queue.offer(2); queue.offer(3); queue.poll(

[剑指Offer] 21.栈的压入、弹出序列

1 class Solution 2 { 3 public: 4 bool IsPopOrder(vector<int> pushV,vector<int> popV) { 5 if(pushV.size() != popV.size()) 6 return false; 7 stack<int> Stack; 8 int i = 0,j = 0; 9 while(i < pushV.size()) 10 { 11 Stack.push(pushV[i ++]);

【剑指offer】两个队列实现堆栈

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25076689     题目:用两个队列模拟一个栈,即用两个队列的出队和入队操作.来实现栈的出栈和入栈操作.     思路:略微画下草图.便不难想出该题的解决方法.思路例如以下: 如果有两个队列Q1和Q2,当二者都为空时,入栈操作能够用入队操作来模拟.能够随便选一个空队列,如果选Q1进行入栈操作.如今如果a,b,c依次入栈了(即依次进入队列Q1).这时如果想模拟出栈操作,则须要将c出栈,由

剑指offer: 栈的压入和弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) (1)如果下一个弹出的数字刚好是栈顶数字,那么直接弹出:(2)如果一下个弹出的数字不在栈顶,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶:(3)如果所有数字都压入栈仍然

按之字形顺序打印二叉树(剑指offer+队栈的应用)

按之字形顺序打印二叉树 参与人数:703时间限制:1秒空间限制:32768K 通过比例:25.31% 最佳记录:0 ms|8552K(  ) 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题意:看测试用例 测试用例: {8,6,10,5,7,9,11} 对应输出应该为: [[8],[10,6],[5,7,9,11]] 思路:用一个布尔量控制从左到右还是从右到左的顺序:先放入栈中,然后把他