面试题目——《CC150》栈与队列
面试题3.1:描述如何只用一个数组来实现三个栈。
方法1:固定分割
方法2:弹性分割(较难)
package cc150; public class ArrayStack { public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
ArrayStack theStack = new ArrayStack();
theStack.push(0, 1);
theStack.push(0, 2);
theStack.push(1, 10);
theStack.push(1, 11);
theStack.push(2, 20);
theStack.push(2, 21); System.out.println(theStack.peek(1));
} int stackSize = 100;
int[] buffer = new int[stackSize * 3];
int[] stackPointer = {-1,-1,-1}; //用于记录每个栈的栈顶在数组的位置,开始是0,100,200 //返回不是的栈的栈顶在数组中的当前位置
int absTopOfStack(int stackNum){
return stackNum * stackSize + stackPointer[stackNum];
} //入栈
void push(int stackNum,int value) throws Exception{
if(stackPointer[stackNum] + 1 >= stackSize){
throw new Exception("超出范围");
}
//栈顶指针自增,并把值放进对应的栈
stackPointer[stackNum]++;
buffer[absTopOfStack(stackNum)] = value;
} //出栈
int pop(int stackNum)throws Exception{
if(stackPointer[stackNum] == -1){
throw new Exception("当前栈为空");
}
int value = buffer[absTopOfStack(stackNum)];
buffer[absTopOfStack(stackNum)] = 0; //清零指定的数组
stackPointer[stackNum]--; //指针自减
return value;
} //返回栈顶元素
int peek(int stackNum){
int index = absTopOfStack(stackNum);
return buffer[index];
} //判断栈是否为空
boolean isEmpty(int staqckNum){
return (stackPointer[staqckNum] == -1);
} }
面试题3.2:请设计一个栈,除pop与push方法,还支持min方法,可返回栈元素中的最小值。push、pop和min三个方法的时间复杂度必须为O(1)。——《Leetcode》155. Min Stack
思路:利用额外的栈来记录每一个状态的最小值,注意当所有小于栈底的元素都弹出后,最小的就是栈底元素
public class MinStack {
Stack<Integer> theStack;
Stack<Integer> theStack_temp; //最小的元素
/** initialize your data structure here. */
public MinStack() {
theStack = new Stack<Integer>();
theStack_temp = new Stack<Integer>(); //最小的元素
} public void push(int x) {
if(theStack.empty() || x<=theStack_temp.peek())
theStack_temp.push(x);
theStack.push(x);//这句放在前会空栈
} public void pop() {
int temp = theStack.pop();
if(temp == theStack_temp.peek())
theStack_temp.pop();
} public int top() {
return theStack.peek();
} public int getMin() {
return theStack_temp.peek();
}
} /**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
面试题3.3:设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样)。
package cc150; import java.util.ArrayList; public class SetOfStacks { public static void main(String[] args) {
// TODO 自动生成的方法存根 } ArrayList<ArrayList<Integer>> stacks = null;
ArrayList<Integer> curStack = null; public ArrayList<ArrayList<Integer>> setOfStacks(int[][] ope, int size) {//第一个表示push或者pop,第二个为待处理的元素
// write code here
stacks = new ArrayList<ArrayList<Integer>>(size);
curStack = new ArrayList<Integer>(size);
stacks.add(curStack); for(int i=0;i<ope.length;i++){
if(ope[i][0] == 1)
push(ope[i][1],size);
else if(ope[i][0] == 2)
pop(size);
}
return stacks;
} public void push(int v,int size){
if(curStack.size() != size){//数组未满
curStack.add(v);
}else{
curStack = new ArrayList<Integer>(size);
curStack.add(v);
stacks.add(curStack);
}
} public void pop(int size){
int temp=0;
if(curStack.size() != 0){//数组未满
temp = curStack.get(curStack.size()-1);
curStack.remove(curStack.size()-1);
}else{
stacks.remove(stacks.size()-1);
curStack = stacks.get(stacks.size()-1);
temp = curStack.get(size-1);
curStack.remove(curStack.size()-1);
}
//return temp;
} }
面试题3.4:汉诺塔问题——部分参考 Java递归算法——汉诺塔问题
面试题3.5:实现一个MyQueue类,该类用两个栈实现一个队列。——《Leetcode》232 Implement Queue using Stacks
面试题3.6:编写程序,按升序对栈进行排序(即最大元素位于栈顶)。最多只能使用一个额外的栈存放临时数据,但不得讲数据复制到别的数据结构中(如数组)。该栈支持如下操作:push、pop、peek和isEmpty。
面试题3.7:猫狗收容所
面试题目——《CC150》栈与队列的更多相关文章
- lintcode :implement queue by two stacks 用栈实现队列
题目 用栈实现队列 正如标题所述,你需要使用两个栈来实现队列的一些操作. 队列应支持push(element),pop() 和 top(),其中pop是弹出队列中的第一个(最前面的)元素. pop和t ...
- LeetCode#232-Implement Queue using Stacks-用栈实现队列
一.题目 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列 ...
- 两个栈实现队列 牛客网 程序员面试金典 C++ Python
两个栈实现队列 牛客网 程序员面试金典 C++ Python 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. C++ //run:5ms memeory ...
- 编程题目: 两个队列实现栈(Python)
感觉两个队列实现栈 比 两个栈实现队列 麻烦 1.栈为空:当两个队列都为空的时候,栈为空 2.入栈操作:当队列2为空的时候,将元素入队到队列1:当队列1位空的时候,将元素入队到队列2: 如果队列1 和 ...
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...
- 算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈
刚入手了一本<程序员代码面试指南>,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象. 题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈, ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- Android面试题目及其答案
转自:http://blog.csdn.net/wwj_748/article/details/8868640 Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应 ...
- Swift 算法实战之路:栈和队列
这期的内容有点剑走偏锋,我们来讨论一下栈和队列.Swift语言中没有内设的栈和队列,很多扩展库中使用Generic Type来实现栈或是队列.笔者觉得最实用的实现方法是使用数组,本期主要内容有: 栈和 ...
- C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)
说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...
随机推荐
- MySQL数据库
1.1 数据库的发展史 1.1.1 萌芽阶段--文件系统 文件系统 1.1.2 第一代数据库--层次模型.网状模型 1.1.2.1层次模型 这是一种导航结构,导航结构的优点:分类管理:导航结构的缺点: ...
- Redis 使用说明 安装配置 主从复制
开机加自启动: echo "redis-server /etc/redis.conf" >>/etc/rc.local 以前有想过用 Memcache 实 ...
- 删除docker的运行目录出错
1. 错误类型
- ANDROID中去掉ACTIONBAR或TABWIDGET的分隔线
在android中,有时需要对ActionBar或者TabWidget的分隔线进行定制,如取消,相关的属性设置为android:divider 以TabWidget为例,取消对应的函数: tabWid ...
- [Django]下拉表单与模型查询
前言:本文主要针对自定义下拉表单制作,下拉表单的内容是取至于数据库,即动态实现下拉表单 正文: 动态实现下拉表单有两种方法: 一.自己手动写 html 模板中的 <form ...> &l ...
- 深入理解Java的接口和抽象类
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- [转载]五种常见的电子商务模式对比:B2B、B2C、C2B、C2C、O2O
转载自http://blog.sina.com.cn/s/blog_64e090b001016843.html 转载自http://blog.sina.com.cn/s/blog_64e090b001 ...
- Moto C118 基于 Osmocom-BB 和 OpenBTS 搭建小型GSM短信基站
此文章PDF文档下载地址:点击下载 0x00 写在前面 大家应该都听说过摩托罗拉C118配合Osmocom-BB实现GSM网络下的短信拦截功能吧,在14年左右新出了一种玩法就是Osmocom-BB的s ...
- 中文乱码?不,是 HTML 实体编码!
When question comes 在 如何用 Nodejs 分析一个简单页面 一文中,我们爬取了博客园首页的 20 篇文章标题,输出部分拼接了一个字符串: var $ = cheerio.loa ...
- IT职场人的“存在主义”
人生在世,最重要的一条就是:找准你的位置.也就是,你的定位问题. 就在前两天,参加一次社交活动,一知名培训师回顾过往,感慨地说:一个好的培训师,一定要定位好自己的客户群,根据他们的需求做好自己的定 ...