面试准备系列02----面试中的栈和队列题目汇总

                                          面试准备系列02----面试中的栈和队列题目汇总

      本文是面试准备系列的第二篇文章,第一篇为面试准备系列01----面试中的链表题目汇总》,下一篇为《面试准备系列03----面试中的二叉树题目汇总》

1.栈的经典应用:括号匹配+表达式计算

http://blog.csdn.net/sheepmu/article/details/21563557

2.两个栈实现队列+两个队列实现栈

http://blog.csdn.net/sheepmu/article/details/38428205

3.实现包括最大最小值的栈O(1)

http://blog.csdn.net/sheepmu/article/details/38459165

4.Linux简化文件路径

题目:https://oj.leetcode.com/problems/simplify-path/

思路:以/分隔字符串,遇到 . 和 空格什么都不做,遇到..退栈,其它都进栈,最后把栈中的都用/连接起来就是简化后的路径

package com.sheepmu;

import java.util.Stack;

/**
 * Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
click to show corner cases.

Corner Cases:
Did you consider the case where path = "/../"?
In this case, you should return "/".
Another corner case is the path might contain multiple slashes '/' together, such as "/home//foo/".
In this case, you should ignore redundant slashes and return "/home/foo".
 * @author Sheep Mu
 *
 */
public class SimplilyPath 
{
	public static void main(String[] args)
	{
		String path="/a/./b/../../c/";
		String result=sp(path);
		System.out.println(result);
	}
	public static String sp(String path)
	{
		if(path==null||path.length()==0)
			return "";
		String[] splits=path.split("/");
		Stack<String> stack=new Stack<String>();
		StringBuffer sb=new StringBuffer();
		for(String ss:splits)
		{
			if(ss.equals(".")||ss.length()==0)//防止//的情况
				continue;
			else if(ss.equals(".."))
			{
				if(!stack.isEmpty())
					stack.pop();
			}
			else
				stack.push(ss);				
		}
		if(!stack.isEmpty())
		{//这里事实上我们又须要把栈里面的内容先进先出了,所以还是用LinkedList方便,它能够同一时候实现栈和队列的方法
		 String[] as=stack.toArray(new String[stack.size()]);//不能toArray()后再强制转换,会报错
		 for(String sss:as)
			 sb.append("/"+sss);
		}
		else//stack为空,
		{
			sb.append("/");
		}
		return sb.toString();
	}
}

5.二叉树的非递归前中后序遍历用Stack,层序遍历用Queue

http://blog.csdn.net/sheepmu/article/details/28941285

6.栈的压人、弹出序列(剑桥Offer22)

输入两个整数序列,第一个序列表示栈的压入顺序,请推断第二个序列是否为该栈的弹出顺序。如果压入栈的全部数字均不相等。比如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列相应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

package com.sheepmu;

import java.util.Stack;

public class Offer22 {
	public static void main(String[] args)
	{
		int[] input={1,2,3,4,5};
		int[] output={2,1,4,3,5};
		if( isPopSequence(input,output))
			System.out.println("true");
		else
			System.out.println("false");
	}
	public static boolean isPopSequence(int[] input,int[]output)
	{
		if(input==null||output==null)
			return false;
		if(input.length==0||output.length==0)
			return false;
		if(input.length!=output.length)
			return false;
		int len=input.length;
		Stack<Integer> stack=new Stack<Integer>();
		int i=0,j=0;
		while(j<len)
		{
			 if(i<len)
			 {
				 stack.push(input[i++]);
				 while(!stack.isEmpty()&&stack.peek()==output[j])
				 { 
					 stack.pop();
					 j++;
				 }
			 }
			 else
				 return false;
		}
		
		return true;
	}
}



posted @ 2015-04-03 19:07  mengfanrong  阅读(170)  评论(0编辑  收藏  举报