空间复杂度是指除了原本的数据存储空间外,算法运行还需要的额外存储空间
基于数组实现,可以自动扩容
分析入栈操作
public class MyArrayStack
{
Object[] baseArray;
int count;//元素个数
int depth;//数组大小
public MyArrayStack(int depth)
{
this.depth = depth;
baseArray = new Object[depth];
}
/**
* 入栈,自动扩容
*
* @param o
* @return
*/
public boolean push(Object o)
{
if (count == depth)
{//扩容
depth *= 2;
Object[] tempArray = new Object[depth];
System.arraycopy(baseArray, 0, tempArray, 0, count);
baseArray = tempArray;
}
baseArray[count] = o;
count++;
return true;
}
/**
* 出栈
*
* @return
*/
public Object pop()
{
if (count == 0)
{
return null;
}
Object o = baseArray[count - 1];
count--;
return o;
}
}
用链表实现,基于 java LinkedList 类
public class StackByLinkedList
{
LinkedList baseList = new LinkedList();
public void push(Object o)
{
baseList.addLast(o);
}
public Object pop()
{
return baseList.removeLast();
}
}
表达式包含三种括号,可以相互嵌套,两两对应为合法形式,类似{[}()]
这种是不合法形式,使用栈来判断是否合法
用栈来保存未匹配的的左括号,从左到右扫描,遇到右括号,与栈顶左括号比较,如果不匹配则不合法,如果匹配则继续
public boolean isValid(String s)
{
Stack stack = new Stack();
HashMap map = new HashMap();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
Set left = map.keySet();
Collection right = map.values();
char[] chars = s.toCharArray();
for (char c : chars)
{
if (stack.empty() && left.contains(c))
{
return false;
}
else if (!stack.empty() && left.contains(c))
{
if ((char) map.get(c) == (char) stack.peek())
{
stack.pop();
}
else
{
return false;
}
}
else
{
stack.push(c);
}
}
if (!stack.empty())
{
return false;
}
else
{
return true;
}
}