Java 用两个队列实现一个栈,要求top()的时间复杂度为O(1)
来源:互联网 发布:淘宝店以开启,怎么找货 编辑:程序博客网 时间:2024/05/16 04:47
如题:用两个队列实现一个栈,要求top()的时间复杂度为O(1),这就要求top元素不是每次去遍历获取到,而是由一个变量存储。2个队列实现栈的关键点在用队列虽然是先进先出,栈是先进后出,但是2个队列,可以把一个队列的元素都弹出到另一个队列,剩下最后一个元素就是栈顶元素。
栈接口:
/** * Create by zxb on 2017/9/3 */public interface IStack<T> { void push(T newElement); void pop(); T top(); int size();}栈实现类:
/** * 用两个队列实现一个栈,要求top()的时间复杂度为O(1) * Create by zxb on 2017/9/10 */public class StackImpl<T> implements IStack<T> { private QueueImpl<T> q1; private QueueImpl<T> q2; private T topRecord; private int size; public StackImpl() { this.q1 = new QueueImpl<>(); this.q2 = new QueueImpl<>(); this.size = 0; } @Override public void push(T newElement) { if (q2.size() == 0) { q1.push(newElement); } else if (q1.size() == 0) { q2.push(newElement); } topRecord = newElement; size++; } @Override public void pop() { if (size <= 0) { return; } if (q2.size() == 0) { //从q1导到q2 if (q1.size() == 1) { //只有一个元素 q1.pop(); topRecord = null; } while (q1.size() > 1) { T front = q1.front(); //倒2元素为新的栈顶元素 if (q1.size() == 2) { topRecord = front; } q2.push(front); q1.pop(); } //弹出最后一个元素 q1.pop(); } else if (q1.size() == 0) { //从q2导到q1 if (q2.size() == 1) { //只有一个元素 q2.pop(); topRecord = null; } while (q2.size() > 1) { T front = q2.front(); //倒2元素为新的栈顶元素 if (q2.size() == 2) { topRecord = front; } q1.push(front); q2.pop(); } //弹出最后一个元素 q2.pop(); } size--; } @Override public T top() { return topRecord; } @Override public int size() { return size; }}测试类:
/** * Create by zxb on 2017/9/10 */public class StackTest { public static void main(String[] args) { IStack stack = new StackImpl(); stack.push(1); stack.push(2); stack.push(3); stack.push(4); stack.pop(); stack.pop(); System.out.println("Top:" + stack.top()); }}运行结果:
阅读全文
0 0
- Java 用两个队列实现一个栈,要求top()的时间复杂度为O(1)
- 实现一个栈,要求Push/Pop/Min(返回最小值)的时间复杂度为O(1)
- 实现一个栈,要求push,pop,Min的操作时间复杂度为O(1)
- 【栈队列】实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈Stack,要求实现Push、Pop、Min(返回最小值的操作)的时间复杂度为O(1)
- 17_7_19:实现一个栈要求实现入栈、出栈、获得最小值的时间复杂度为O(1)
- 实现一个栈,要求pop,push,Min,时间复杂度为O(1)
- 定义一个栈的数据结构,要求实现一个min函数,每次能够得到栈的最小值,并且要求Min的时间复杂度为O(1)
- 定义一个栈的数据结构,要求实现一个min函数,每次能够得到栈的最小值,并且要求Min的时间复杂度为O(1)
- 栈--实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 【数据结构】实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- ~实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)~
- 剑指offer 21---实现一个栈, 要求实现Push( 出栈) 、 Pop( 入栈) 、 Min( 返回最小值的操作) 的时间复杂度为O(1)
- 1. 实现一个栈,要求实现 Push (出栈)、 Pop (入栈)、 Min (返回最小值的操作) 的时间复杂度为 O(1)
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- HDU4553(线段树区间合并)
- colorAccent,colorPrimary,colorPrimaryDark做什么的?
- 牛客网-剑指offer-12-数值的整数次方
- Make Palindrome
- 面试题:整数反序
- Java 用两个队列实现一个栈,要求top()的时间复杂度为O(1)
- 图像处理基本概念——卷积,滤波,平滑
- Hebb Learning 监督学习的例子
- LeetCode AddTwoNumbers
- HDU2159FATE(完全背包变形)
- Java 监听器
- C#和C++的区别(一)
- 第五章 概率分析和随机算法
- RocketMQ双Master模式环境搭建