欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【程序员代码面试指南】-栈和队列-最小栈/ 双栈队列/ 栈排序

程序员文章站 2022-04-21 19:42:10
...

【题目一】

实现一个特殊栈,实现pop,push函数并且实现返回栈中最小元素的函数getMin

【要求】

时间复杂度O(1),可以使用现成的栈结构

【代码】

//用两个栈实现,一个正常存取,另一个只存放当前最小值
	private Stack<Integer> stackData;	
	private Stack<Integer> stackMin;
	
	public Stack01() {
		stackData = new Stack<>();
		stackMin = new Stack<>();
	}
	
	public void push(int data) {
		if (stackMin.isEmpty()) {
			stackMin.push(data);
		}else if (data < stackMin.peek()) {
			stackMin.push(data);
		}else{
			stackMin.push(stackMin.peek());
		}
		stackData.push(data);
	}
	
	public int pop() {
		if (stackData.isEmpty()) {
			System.out.println("stack is Empty");
			return -999;
		}
		stackMin.pop();
		return stackData.pop();
	}
	
	public int getMin() {
		if (stackData.isEmpty()) {
			System.out.println("stack is Empty");
			return -999;
		}
		return stackMin.peek();
		
	}

【测试】

【程序员代码面试指南】-栈和队列-最小栈/ 双栈队列/ 栈排序

【题目二】

用两个栈实现队列,实现pop,add,peek操作

【代码】

//用两个栈实现,一个负责压入,另一个负责弹出,查看
	private Stack<Integer> stackPush;	
	private Stack<Integer> stackPop;
	
	public Queue01() {
		stackPush = new Stack<>();
		stackPop = new Stack<>();
	}
	
	public void add(int data) {
		stackPush.push(data);
	}
	
	public int pop() {
		if (stackPop.isEmpty()) {
			if (!stackPush.isEmpty()) {
				//将目前压入栈的所有元素依次弹出,压入弹出栈
				while (!stackPush.isEmpty()) {
					stackPop.push(stackPush.pop());
				}
			}else {
				throw new RuntimeException("stack is Empty");
			}
		}
		return stackPop.pop();
	}	
	
	public int peek() {
		if (stackPop.isEmpty()) {
			if (!stackPush.isEmpty()) {
				//将目前压入栈的所有元素依次弹出,压入弹出栈
				while (!stackPush.isEmpty()) {
					stackPop.push(stackPush.pop());
				}
			}else {
				throw new RuntimeException("stack is Empty");
			}
		}
		return stackPop.peek();
	}

【测试】

【程序员代码面试指南】-栈和队列-最小栈/ 双栈队列/ 栈排序

【题目三】

实现栈从顶到底按从大到小排序,除了一个栈外,不能申请其他数据结构

【代码】

public static void sortByStack(Stack<Integer> stack) {
		Stack<Integer> help = new Stack<>();
		while(!stack.isEmpty()) {
			//从stack栈顶取出一个元素,存入临时tem里
			int tem = stack.pop();
			//将help里小于tem的元素从上到下依次弹出压会stack中
			while (!help.isEmpty() && help.peek()<tem ) {
				stack.push(help.pop());
			}
			//将tem压入help中,此时要么help只有tem一个元素
			// 要么tem下边的元素均比tem大 
			help.push(tem);
			//重复上述过程,实现help内元素顶到底是从小到大排列的,stack为空
		}
		while (!help.isEmpty()) {
			stack.push(help.pop());
		}
	}

	//实现从顶到底打印,借助help栈,依次弹出stack元素到help并打印,
	// 然后再还原stack 
	public static void printFromTtoE(Stack<Integer> stack) {
		Stack<Integer> help = new Stack<>();
		Iterator<Integer> it = stack.iterator();
		int tem = 0;
		while (it.hasNext()) {
			tem = stack.pop();
			help.push(tem);
			System.out.print(tem+" ");
		}
		System.out.println();
		while (!help.isEmpty()) {
			stack.push(help.pop());
		}
	}

【测试】

【程序员代码面试指南】-栈和队列-最小栈/ 双栈队列/ 栈排序