zoukankan      html  css  js  c++  java
  • 面试题目——《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:猫狗收容所

  • 相关阅读:
    linux 笔试题
    shell -Z- d等等代表
    shell中for循环总结
    linux启动过程
    linux面试题3
    linux面试题2
    小峰servlet/jsp(4)EL表达式
    小峰servlet/jsp(3)登陆功能实现
    小峰servlet/jsp(2)
    java日期比较例子等...
  • 原文地址:https://www.cnblogs.com/tonglin0325/p/5872786.html
Copyright © 2011-2022 走看看