zoukankan      html  css  js  c++  java
  • 03-数组实现栈与队列

    题目1:用数组结构实现大小固定的队列和栈

    弹夹结构 -- 栈

    排队结构 -- 队列

    数组实现队列queue

    固定数组如何实现队列

    end不断循环
    start追end
    size解耦

    题目二 实现一个特殊的栈 ,实现返回栈中最小元素的操作

    在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

    【要求】

    1.pop、push、getMin操作的时间复杂度都是O(1)。

    2.设计的栈类型可以使用现成的栈结构。

    package class_03;
    
    import java.util.Stack;
    
    public class Code_02_GetMinStack {
    	public static class MyStack1 {
    		private Stack<Integer> stackData;
    		private Stack<Integer> stackMin;
    
    		public MyStack1() {
    			this.stackData = new Stack<Integer>();
    			this.stackMin = new Stack<Integer>();
    		}
    
    		public void push(int newNum) {
    			if (this.stackMin.isEmpty()) {
    				this.stackMin.push(newNum);
    			} else if (newNum <= this.getmin()) {
    				this.stackMin.push(newNum);
    			}
    			this.stackData.push(newNum);
    		}
    
    		public int pop() {
    			if (this.stackData.isEmpty()) {
    				throw new RuntimeException("Your stack is empty.");
    			}
    			int value = this.stackData.pop();
    			if (value == this.getmin()) {
    				this.stackMin.pop();
    			}
    			return value;
    		}
    
    		public int getmin() {
    			if (this.stackMin.isEmpty()) {
    				throw new RuntimeException("Your stack is empty.");
    			}
    			return this.stackMin.peek();
    		}
    	}
    
    	public static class MyStack2 {
    		private Stack<Integer> stackData;
    		private Stack<Integer> stackMin;
    
    		public MyStack2() {
    			this.stackData = new Stack<Integer>();
    			this.stackMin = new Stack<Integer>();
    		}
    
    		public void push(int newNum) {
    			if (this.stackMin.isEmpty()) {
    				this.stackMin.push(newNum);
    			} else if (newNum < this.getmin()) {
    				this.stackMin.push(newNum);
    			} else {
    				int newMin = this.stackMin.peek();
    				this.stackMin.push(newMin);
    			}
    			this.stackData.push(newNum);
    		}
    
    		public int pop() {
    			if (this.stackData.isEmpty()) {
    				throw new RuntimeException("Your stack is empty.");
    			}
    			this.stackMin.pop();
    			return this.stackData.pop();
    		}
    
    		public int getmin() {
    			if (this.stackMin.isEmpty()) {
    				throw new RuntimeException("Your stack is empty.");
    			}
    			return this.stackMin.peek();
    		}
    	}
    
    	public static void main(String[] args) {
    		MyStack1 stack1 = new MyStack1();
    		stack1.push(3);
    		System.out.println(stack1.getmin());
    		stack1.push(4);
    		System.out.println(stack1.getmin());
    		stack1.push(1);
    		System.out.println(stack1.getmin());
    		System.out.println(stack1.pop());
    		System.out.println(stack1.getmin());
    
    		System.out.println("=============");
    
    		MyStack1 stack2 = new MyStack1();
    		stack2.push(3);
    		System.out.println(stack2.getmin());
    		stack2.push(4);
    		System.out.println(stack2.getmin());
    		stack2.push(1);
    		System.out.println(stack2.getmin());
    		System.out.println(stack2.pop());
    		System.out.println(stack2.getmin());
    	}
    
    }
    
    

    题目三:队列实现栈,栈实现队列

    如何仅用队列结构实现栈结构?

    深度优先遍历用栈实现

    面试官:用队列实现深度优先遍历,(两个队列实现1个栈)
    面试官就这样贱

    Data与Help队列交换引用

    每次只能从Data队列中插入数据,或者弹出数据

    如何仅用栈结构实现队列结构?

    用户进data永远进push栈
    取数据从pop中出

    2个原则
    1)一次倒完
    2)pop中有东西,不能倒数据

    package class_03;
    
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Stack;
    
    public class Code_03_StackAndQueueConvert {
    
    	public static class TwoStacksQueue {
    		private Stack<Integer> stackPush;
    		private Stack<Integer> stackPop;
    
    		public TwoStacksQueue() {
    			stackPush = new Stack<Integer>();
    			stackPop = new Stack<Integer>();
    		}
    
    		public void push(int pushInt) {
    			stackPush.push(pushInt);
    		}
    
    		public int poll() {
    			if (stackPop.empty() && stackPush.empty()) {
    				throw new RuntimeException("Queue is empty!");
    			} else if (stackPop.empty()) {
    				while (!stackPush.empty()) {
    					stackPop.push(stackPush.pop());
    				}
    			}
    			dao();
    			return stackPop.pop();
    		}
    
    		public int peek() {
    			if (stackPop.empty() && stackPush.empty()) {
    				throw new RuntimeException("Queue is empty!");
    			} else if (stackPop.empty()) {
    				while (!stackPush.empty()) {
    					stackPop.push(stackPush.pop());
    				}
    			}
    			
    			dao();
    			return stackPop.peek();
    		}
    		
    		// 倒数据的行为
    		public void dao(){
    			if(!stackPop.isEmpty()){
    				return;
    			}
    			while(!stackPush.isEmpty()){
    				stackPop.push(stackPush.pop());
    			}
    		}
    		
    	}
    
    	public static class TwoQueuesStack {
    		private Queue<Integer> queue;
    		private Queue<Integer> help;
    
    		public TwoQueuesStack() {
    			queue = new LinkedList<Integer>();
    			help = new LinkedList<Integer>();
    		}
    
    		public void push(int pushInt) {
    			queue.add(pushInt);
    		}
    
    		public int peek() {
    			if (queue.isEmpty()) {
    				throw new RuntimeException("Stack is empty!");
    			}
    			while (queue.size() != 1) {
    				help.add(queue.poll());
    			}
    			int res = queue.poll();
    			help.add(res);
    			swap();
    			return res;
    		}
    
    		public int pop() {
    			if (queue.isEmpty()) {
    				throw new RuntimeException("Stack is empty!");
    			}
    			while (queue.size() > 1) {
    				help.add(queue.poll());
    			}
    			int res = queue.poll();
    			swap();
    			return res;
    		}
    
    		// 改变help与data的引用
    		private void swap() {
    			Queue<Integer> tmp = help;
    			help = queue;
    			queue = tmp;
    		}
    
    	}
    
    }
    
    

    左神邮箱:chengyunzuo@sina.com

  • 相关阅读:
    【转】fastjson-1.2.47-RCE
    某安全设备未授权访问+任意文件下载0day
    关于伴侣
    【转】Why BIOS loads MBR into 0x7C00 in x86 ?
    【生活】北京旅游攻略
    利用Python读取图片exif敏感信息
    A MacFUSE-Based Process File System for Mac OS X
    linux-强制断开远程tcp连接
    Navicat use HTTP Tunnel
    python mac下使用多进程报错解决办法
  • 原文地址:https://www.cnblogs.com/venicid/p/9992857.html
Copyright © 2011-2022 走看看