这篇文章里的题目均整理于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<T> {
public T data;
public Node<T> next;
}
栈的简单实现 in Java:
public class Stack<T> {
Node<T> top;
public void push(T data) {
Node<T> item = new Node<T>();
item.data = data;
item.next = top;
top = item;
}
public Node<T> pop() {
if (top == null) {
return null;
} else {
Node<T> item = top;
top = top.next;
return item;
}
}
public Node<T> peek() {
return top;
}
}
队列Queue的特点,先进先出,FIFO。队列的基本操作:enqueue进队,dequeue出队。注意千万不要插队,jump_the_queue。最近放暑假回国买东西的时候老被人插队搞得很是艹蛋。
队列的简单实现 in Java:
public class Queue<T> {
private Node<T> first, last;
public void enqueue(T data) {
Node<T> item = new Node<T>();
item.data = data;
if (first == null) {
last = item;
first = item;
} else {
last.next = item;
last = item;
}
}
public Node<T> dequeue() {
if (first == null) {
return null;
} else {
Node<T> 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。