队列中取最大值操作问题

问题:

假设有这样一个拥有3个操作的队列:

1. EnQueue(v): 将v加入队列中

2. DeQueue(): 使队列中的队首元素删除并返回此元素

3. MaxElement: 返回队列中的最大元素

设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能地低。

思路:

(1)用两个栈设计一个新的数据类型(数据类型定义为MyStack),其中一个栈用来存放数据,另一个栈用来存放最大值,

当插入数据时,第一个栈接受数据进行入栈操作,第二栈首先判断一下栈顶元素和插入元素的大小,如果栈顶元素小于新插入的元素,那么,第二个堆栈进行入栈操作,如果栈顶元素小于新插入的元素的大小,第二个栈不做操作!!!

当删除元素时,第一个栈直接进行出栈操作,第二个栈拿出栈顶元素和第一个栈中出栈元素进行比较,如果相等,第二个栈进行出栈操作,否则不做操作

由上面意思可知,第二个栈的栈顶元素就是最大值

自定义栈的源代码为(java实现):

package com.panther.dong.beautyprogram.thirdchapter.section7;

import java.util.Stack;

/**
 * Created by panther on 15-8-20.
 */
public class MyStack {
    private Stack<Integer> stack1 = new Stack<Integer>();
    private Stack<Integer> stack2 = new Stack<Integer>();

    public void push(int e) {
        stack1.push(e);
        if (stack2.size() == 0 || stack2.peek() < e) {
            stack2.push(e);
        }
    }

    public int pop() {
        int temp = stack1.pop();
        if (temp == stack2.peek()) {
            stack2.pop();
        }
        return temp;
    }

    public int max() {
        if (stack2.size() != 0) {
            return stack2.peek();
        } else {
            return 0;
        }
    }

    public int size() {
        return stack1.size();
    }

    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push(4);
        myStack.push(8);
        myStack.push(6);
        myStack.push(5);
        myStack.push(3);
        myStack.push(9);
        myStack.push(3);
        myStack.push(14);

        System.out.println(myStack.max());
        myStack.pop();
        myStack.pop();
        myStack.pop();
        System.out.println(myStack.max());
    }
}

自定义栈的测试运行结果为:

(2)第二步,用自己定义的栈(MyStack)来实现队列所需的功能,进队列直接在myStack1中入栈,出队列,首先判断一下myStack2是否为空,不为空直接从myStack2出栈,

如果为空,先将myStack1中的数据全部放到myStack2中,myStack2再进行出栈操作!!!!!最大值为myStack1和myStack2中最大值的最大值!!!!!

具体的代码实现(java代码实现):

package com.panther.dong.beautyprogram.thirdchapter.section7;

/**
 * Created by panther on 15-8-19.
 */
public class MyQueue {
    private MyStack myStack1 = new MyStack();
    private MyStack myStack2 = new MyStack();

    public void EnQueue(int element) {
        myStack1.push(element);
    }

    public int DeQueue() {
        int element = 0;
        if (myStack2.size() != 0) {
            element = myStack2.pop();
        } else {
            while (myStack1.size() != 0) {
                myStack2.push(myStack1.pop());
            }
            element = myStack2.pop();
        }
        return element;
    }

    public int MaxElement() {
        return myStack1.max() > myStack2.max() ? myStack1.max() : myStack2.max();
    }

    public static void main(String[] args) {package com.panther.dong.beautyprogram.thirdchapter.section7;

/**
 * Created by panther on 15-8-19.
 */
public class MyQueue {
    private MyStack myStack1 = new MyStack();
    private MyStack myStack2 = new MyStack();

    public void EnQueue(int element) {
        myStack1.push(element);
    }

    public int DeQueue() {
        int element = 0;
        if (myStack2.size() != 0) {
            element = myStack2.pop();
        } else {
            while (myStack1.size() != 0) {
                myStack2.push(myStack1.pop());
            }
            element = myStack2.pop();
        }
        return element;
    }

    public int MaxElement() {
        return myStack1.max() > myStack2.max() ? myStack1.max() : myStack2.max();
    }

    public static void main(String[] args) {
        MyQueue myQueue = new MyQueue();
        myQueue.EnQueue(7);
        myQueue.EnQueue(3);
        myQueue.EnQueue(5);
        myQueue.EnQueue(2);
        myQueue.EnQueue(9);
        myQueue.EnQueue(11);
        myQueue.EnQueue(21);
        myQueue.EnQueue(14);
        myQueue.EnQueue(17);
        myQueue.EnQueue(18);
        myQueue.EnQueue(4);
        myQueue.EnQueue(8);
        myQueue.EnQueue(3);
        myQueue.EnQueue(4);
        System.out.println(myQueue.MaxElement());
        System.out.println(myQueue.DeQueue());
        System.out.println(myQueue.MaxElement());
        System.out.println(myQueue.DeQueue());
        System.out.println(myQueue.MaxElement());
        System.out.println(myQueue.DeQueue());
        System.out.println(myQueue.MaxElement());
        System.out.println(myQueue.DeQueue());
        System.out.println(myQueue.MaxElement());
        System.out.println(myQueue.DeQueue());
        System.out.println(myQueue.MaxElement());
        System.out.println(myQueue.DeQueue());
        System.out.println(myQueue.MaxElement());
        System.out.println(myQueue.DeQueue());
        System.out.println(myQueue.MaxElement());
        System.out.println(myQueue.DeQueue());
        System.out.println(myQueue.MaxElement());
        System.out.println(myQueue.DeQueue());
        System.out.println(myQueue.MaxElement());
        System.out.println(myQueue.DeQueue());

    }
}

运行结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 08:05:53

队列中取最大值操作问题的相关文章

编程之美之队列中取最大值操作

问题: 假设有这样一个拥有3个操作的队列: 1. EnQueue(v): 将v加入队列中 2. DeQueue(): 使队列中的队首元素删除并返回此元素 3. MaxElement: 返回队列中的最大元素 设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能地低. #include<iostream> #include<limits.h> using namespace std; class Stack { public: Stack() { stackTop =

队列中取最大值操作

假设有这样一个拥有3个操作的队列: 1.EnQueue(v):将v加入队列 2.DeQueue:使队列中的队首元素删除并返回元素 3.MaxElement:返回队列中的最大元素 请设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能低 研究这个问题之前,先研究两个子问题: 1.设计一个包含min操作的栈 2.用栈实现队列 一.设计一个包含min操作的栈 考虑给栈增加一个成员变量MinValue,有元素入栈的时候,将入栈元素与MinValue相比,如果小于MinValue,用入栈元

编程之美---队列中取最大值操作问题

如何快速获取队列中的最大值? 最简单的办法,用一个for循环遍历,复杂度为o(n). 解法二:用大顶堆来实现,复杂度为哦o(1),但是入队和出队复杂度变为o(logN),堆中的每一个元素还得有个指针指向它的后继元素. 解法三:可以使用两个栈来模拟队列,从右边的栈进入元素相当于入队,出队时,只有当左边的栈为空时,才把右边栈的元素全部出栈到左边的栈. 1 class stack 2 { 3 public: 4 stack() 5 { 6 stackTop = -1; 7 maxItemIndex =

编程之美——队列中取最大值操作

为实现O(1)的时间复杂度完成取队列中最大元素,使用maxStackItemIndex记录队列(使用两个栈实现)中最大元素下标,使用数组link2NextMaxItem[]记录数组中次大值的下标,这也就是使用两个栈(先进后出)模拟队列二不是直接使用队列(先进先出)的原因:先进后出可以保证当执行pop操作(pop出最大值)时可以更新maxStackItemIndex=link2NextMaxItem[stackTop]:而队列则不具有这种回溯特性: 代码: 1 #include<iostream>

&lt;&lt;编程之美&gt;&gt; -- 队列中取最大值操作的问题

不得不说编程之美是一本好书,虽然很多题目在做acm中的过程中遇到过,不过还是有很多值得思考的地方 这是今天在编程之美上看到的一个问题,对于栈转化成队列的一个思考 平时都太过依赖c++内函数库中的栈和队列,但是对于他们的扩展我们还是应该自己进行手写栈和队列来实现更简单的算法 题目大意: 假设有这样一个拥有3个操作的队列: 1. EnQueue(v) : 将 v 加入队列 2. DeQueue: 使队列中队首元素删除并返回此元素 3.MaxElement: 返回队列中的最大元素 设计一种数据结构和算

3.7 队列中取最大值操作问题

问题: 假设有这样一个拥有3个操作的队列: 1. EnQueue(v): 将v加入队列中 2. DeQueue(): 使队列中的队首元素删除并返回此元素 3. MaxElement: 返回队列中的最大元素 设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能地低. 方法:用两个栈来模拟队列 在代码中,maxStackItemIndex代表栈中最大的数的下标 link2NextMaxItem[index]表示当前index这个下标代表的数字(当前是最大的)如果没有的话,那么最大的那

程之美第3章结构之法-字符串及链表的探索3.7 队列中取最大值操作问题

#include<iostream> #include<vector> using namespace std; class stack { private: vector<int> vec;//用来保存当前进栈的值 vector<int> max_vec; public: void push(int a) { vec.push_back(a); if(max_vec.size()==0||a>vec[max_vec[max_vec.size()-1]

【编程之美】3.7 队列取最大值操作问题 ☆

之前写过栈的,以为队列的也一样,结果一点都不一样.写了好久啊. 因为栈是后进先出,先进去的数字不会影响后面的数字:而队列是先进先出,后进去的会受先进入的数字的影响. 比如: (先)  1 9 3 8 4 (后)  这样的序列 栈存储        1 9               就可以了,因为9弹出后,自然 1 就是最大的 队列则不行,如果按上面存储9弹出后 剩下 3 8 4,8是最大的,没有存储. 我的方法,保存一个max的队列 入队列时: 如果新值比 max的最前面的元素大,那么把max

在含有null值的复杂类的集合(Collection)中取最大值

在日常编程中,经常遇到要在一组复杂类的集合(Collection)中做比较.取最大值或最小值. 举个最简单的例子,我们要在一个如下结构的集合中选取包含最大值的元素: public class Class<T> where T : struct { public T? Value { get; set; } } var ints = new List<Class<int>>() { new Class<int>() { Value = 2 }, new Cla