问题:
假设有这样一个拥有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