前言
线性结构是最简单、最常用的数据结构之一。线性结构的特点是:在数据元素的有限集中,除第一个元素无直接前驱,最后一个元素无直接后续外,每个元素有且仅有一个直接前驱和一个直接后继元素。
从逻辑结构上来说,栈和队列是线性结构,但是与线性表不同的是它们所支持的基本操作是受到限制的。
栈和队列
栈又称堆栈,其限制是仅允许在表的一端(栈顶)进行插入和删除操作,不允许在其他位置进行插入、删除等操作,所以后进栈的元素必定先出栈(后进先出)。
栈的基本操作:
- getSize():返回堆栈的大小,即数据元素的个数
- isEmpty():判断堆栈是否为空
- push(e):元素入栈
- pop():栈顶元素出栈,并返回
- peek():获取栈顶元素,但不出栈
队列,其限制是仅允许在表的一端(队尾rear)进行插入,而在表的另一端(队首front)删除,所以先进队的必然先离队(先进先出)。新元素入队后成为队尾元素,从队列中删除元素后,其后续元素成为新的队首元素。
队列的基本操作:
- getSize():返回队列的大小,即数据元素的个数
- isEmpty():判断队列是否为空
- enqueue(e):元素入队
- dequeue():栈顶元素出队,并返回
- peek():获取队首元素,但不出队列
堆栈的应用
进制转换
public void baseConversion(int num,int target) {
Stack<Integer> s = new Stack<Integer>();
while(num>0) {
s.push(num%target);
num = num/target;
}
while(!s.isEmpty()) System.out.println(s.pop());
}
括号匹配检测
假设表达式中包括三种符号:圆括号、方括号和花括号,并且它们可以任意相互嵌套,例如{{}}、[{()}]等为正确格式,而{[()])或({])为不正确的格式。
public static boolean bracketMatch(String str) {
Stack<Character> st = new Stack<Character>();
for(int i=0;i<str.length();i++) {
char c= str.charAt(i);
//如果是左括号,则直接入栈,等待相匹配的同类右括号。
switch(c)
{
case '{':
case '[':
case '(': st.push(c);break;
//如果是右括号,而堆栈为空,说明没有括号匹配,属于非法情况;
case '}':
if(!st.isEmpty() && st.pop().charValue()=='{')
break;
else return false;
case ')':
if(!st.isEmpty() && st.pop().charValue()=='(')
break;
else return false;
case ']':
if(!st.isEmpty() && st.pop().charValue()=='[')
break;
else return false;
}
}
//一直到字符读完,而堆栈不为空,则说明左括号没有得到匹配,属于非法情况
if(st.isEmpty()) return true;
else return false;
}
参考
数据结构与算法(JAVA语言版)——周鹏
如有侵权,请联系作者更正