常见栈、队列面试题

这篇文章里的题目均整理于Cracking the Code Interview 2nd Edition。栈和队列一般不会在面试题里面单独做为一整个题出现,往往都是作为一种辅助的数据结构,利用栈和队列的性质去解决某一类题目。


栈Stack的特点,先进后出,LIFO。栈的基本操作:push压栈,pop出栈,peek返回栈顶元素但栈不变化。

栈和队列里的元素实现 in Java,这里用到的范型。如果你不知道什么是Java的范型,参见这篇文章:http://blog.csdn.net/explorers/article/details/454837

public class Node {
	
	public T data;
	public Node next;
	
}

栈的简单实现 in Java:

public class Stack {
	Node top;

	public void push(T data) {
		Node item = new Node();
		item.data = data;
		item.next = top;
		top = item;
	}

	public Node pop() {
		if (top == null) {
			return null;
		} else {
			Node item = top;
			top = top.next;
			return item;
		}
	}

	public Node peek() {
		return top;
	}
}


队列Queue的特点,先进先出,FIFO。队列的基本操作:enqueue进队,dequeue出队。注意千万不要插队,jump_the_queue。最近放暑假回国买东西的时候老被人插队搞得很是艹蛋。

队列的简单实现 in Java:

public class Queue {
	private Node first, last;

	public void enqueue(T data) {
		Node item = new Node();
		item.data = data;
		if (first == null) {
			last = item;
			first = item;
		} else {
			last.next = item;
			last = item;
		}
	}

	public Node dequeue() {
		if (first == null) {
			return null;
		} else {
			Node item = first;
			first = first.next;
			return item;
		}
	}
}

1. How would you design a stack which, in addition to push and pop, also has a function min which returns the minimum element? Push, pop and min should all operate in O(1) time. 在常数时间里实现一个栈的插入,删除,和返回最小值操作。

来源:Cracking the Coding Interview 2nd Edition Charpter3 Question2.

【解答】:栈的插入和删除操作可以在常数时间完成,但是如何设计这个min()函数呢?最直观的想法是利用一个新的field来保存这个最小值,每次push的时候都检查这个最小值。但问题出在pop的时候,如何pop出去的是最小值,那么就要重新选择最小值,如何在O(1)时间找到这个新的最小值呢?

这里给出一个方法,就是再建一个stack:s2,来保存迄今位置每次压栈操作得到的最小值。一旦原栈被pop出的是一个最小值,那么s2也执行pop操作。

解答的Java实现:http://pastebin.com/ivRpMT8Y 这里的stack继承自jdk util包下的Stack。


2. Implement a MyQueue class which implements a queue using two stacks. 用两个栈实现一个队列MyClass。

来源:Cracking the Coding Interview 2nd Edition Charpter3 Question5.

【解答】:栈的特点:LIFO,队列则是FIFO,也就是如果压入栈的元素可以自底而上的出栈的话,就满足队列的情况了。那么可以想到的办法,就是反转一个stack。这里的两个stack,一个用来push新的元素称为newStack,另一个则存放的是反转过元素的,称为oldStack。每次enqueue操作,存入newStack中,每次dequeue从oldStack中pop。当oldStack为空的时候,把newStack中的元素反转存入oldStack。

另外要注意的就是关于一个queue的基本API,enqueue(),dequeue(),size(),isEmpty()等,但大致的思路不能错,尤其是enqueue和dequeue操作。

实现in Java:http://pastebin.com/WkFzrh8Z 这里的stack继承自jdk util包下的Stack。

你可能感兴趣的:(Questions,面试,java,null,class,数据结构,jdk)