常见栈、队列面试题

这篇文章里的题目均整理于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。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值