栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。(百度百科)
栈能解决很多经典问题,比如括号配对问题,表达式求值问题。。。下面是用链表实现的栈,并用来解决括号配对问题,
首先这是写过的单链表:https://blog.csdn.net/king8611/article/details/81099344
先用一个接口说明栈能实现的方法:
public interface Stack<T>{
boolean isEmpty(); //判断是否为空
void push(T x); //插入一个元素
T pop(); //栈顶元素并删除
T peek(); //返回栈顶元素
void clear(); //清空栈
}
然后是用链表实现一个栈:
public class LinkedStack<T> implements Stack<T>{
private SinglyList<T> list;
public LinkedStack() {
list=new SinglyList<T>();
}
public boolean isEmpty() {
return this.list.isEmpty();
}
@Override
public void push(T x) {
this.list.insert(0,x);
}
@Override
public T pop() {
return this.list.remove(0);
}
@Override
public T peek() {
return this.list.get(0);
}
@Override
public void clear() {
this.list.clear();
}
}
最后用以解决括号配对问题:
import java.util.*;
public class StackTest {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Stack<Character> stack=new LinkedStack<Character>();
while(sc.hasNext()){
String str=sc.next();
p1:for(int i=0;i<str.length();i++){
char ch=str.charAt(i);
switch(ch){
case'(':case'[': //如果是左括号,加入栈内
stack.push(ch);break;
default: //如果是右括号,并且栈内没有元素,说明这个不配对
if(stack.isEmpty()){System.out.println("这个表达式不配对。");break p1;}
else { //另外如果栈顶的括号和现在的括号不配对,那说明也不配对
char ch2=stack.pop();
if(ch==')'&&ch2!='('||ch==']'&&ch2!='['){System.out.println("这个表达式不配对。");break p1;}
}
}
if(i==str.length()-1){ //到最后如果现在栈是空的就配对,否则不配对。
if(stack.isEmpty())System.out.println("这个表达式是配对的。");
else System.out.println("这个表达式不配对。");
}
}
stack.clear();
}
}
}
当然,JAVA有给我们提供好的栈,不用我们自己写了,在util包里,Stack类,下面是一些基本方法:
Stack<Character> stack=new Stack<Character>();