面试题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》栈与队列的更多相关文章

  1. lintcode :implement queue by two stacks 用栈实现队列

    题目 用栈实现队列 正如标题所述,你需要使用两个栈来实现队列的一些操作. 队列应支持push(element),pop() 和 top(),其中pop是弹出队列中的第一个(最前面的)元素. pop和t ...

  2. LeetCode#232-Implement Queue using Stacks-用栈实现队列

    一.题目 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列 ...

  3. 两个栈实现队列 牛客网 程序员面试金典 C++ Python

    两个栈实现队列 牛客网 程序员面试金典 C++ Python 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. C++ //run:5ms memeory ...

  4. 编程题目: 两个队列实现栈(Python)

    感觉两个队列实现栈 比 两个栈实现队列 麻烦 1.栈为空:当两个队列都为空的时候,栈为空 2.入栈操作:当队列2为空的时候,将元素入队到队列1:当队列1位空的时候,将元素入队到队列2: 如果队列1 和 ...

  5. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

  6. 算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈

    刚入手了一本<程序员代码面试指南>,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象. 题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈, ...

  7. 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...

  8. Android面试题目及其答案

    转自:http://blog.csdn.net/wwj_748/article/details/8868640 Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应 ...

  9. Swift 算法实战之路:栈和队列

    这期的内容有点剑走偏锋,我们来讨论一下栈和队列.Swift语言中没有内设的栈和队列,很多扩展库中使用Generic Type来实现栈或是队列.笔者觉得最实用的实现方法是使用数组,本期主要内容有: 栈和 ...

  10. C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)

     说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...

随机推荐

  1. 大数据系列(5)——Hadoop集群MYSQL的安装

    前言 有一段时间没写文章了,最近事情挺多的,现在咱们回归正题,经过前面四篇文章的介绍,已经通过VMware安装了Hadoop的集群环境,相关的两款软件VSFTP和SecureCRT也已经正常安装了. ...

  2. 【转载】 Java线程面试题 Top 50

    Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...

  3. 【转】深入理解 Java 垃圾回收机制

    深入理解 Java 垃圾回收机制   一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  4. ubuntu下新建用户

    ubuntu下新建用户和RedHat系列的linux有点不一样 新建用户的命令是useradd,修改密码是passwd,如下: sudo useradd zhuhui sudo passwd 1234 ...

  5. MVC架构学习之Smarty学习——病来而蔫

    前两天是五一小长假,而每次假期都想着如何如何刻苦一番,往往是自作多情.. 当然这次是有小病在身,多个借口吧. 一有病就蔫的不行...要锻炼了啊,脚估计也差不多了,游泳试试吧这周. 这次学习Smarty ...

  6. 修改VMware虚拟机里面的显卡名称

    修改VMware虚拟机里面的显卡名称 现在有些蛋疼坑爹的游戏,会检测显卡的名称,如果其中有“Vmware”这类的字眼,就会提示程序在虚拟机中运行而拒绝执行(太不科学了嘛,我要是把我的实机驱动名称也改成 ...

  7. UNIX系统基本结构

    UNIX系统的基本结构如图所示.整个UNIX系统可分为五层:最底层是裸机,即硬件部分:第二层是UNIX的核心,它直接建立在裸机的上面,实现了操作系统重要的功能,如进程管理.存储管理.设备管理.文件管理 ...

  8. Python-04-基础

    一.装饰器(decorator) 装饰器本质上也是函数,目的是为其他函数添加附加功能(装饰其他函数) Python通过使用装饰器来达到代码的开放与封闭. 原则: 不能修改被装饰函数的源代码. 不能修改 ...

  9. 12款经典的白富美型—jquery图片轮播插件—前端开发必备

    图片轮播是网站中的常用功能,用于在有限的网页空间内展示一组产品图片或者照片,同时还有非常吸引人的动画效果.本文向大家推荐12款实用的 jQuery 图片轮播效果插件,帮助你在你的项目中加入一些效果精美 ...

  10. ionic angularJS input 相关指令 以及定时器 的使用

      <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" conte ...