这里写目录标题
- 栈的概念
- 什么是栈
- 举个栗子
- 栈在应用中的作用
- 具体实现
- 栈接口
- 栈具体实现
- 栈测试
栈的概念
什么是栈
栈是一个先进后出(First In Last out)的数据结构,出栈(从栈中取出元素)入栈(往栈中存入元素)只能在栈顶进行。
举个栗子
看了上述的表述是不是云里雾里的,没事我举个例子你就明白了。大家都打过羽毛球吧,装羽毛球的圆筒就能看作是一个栈,它首尾由一个开口和封闭的底部组成。
我们打完羽毛球,将羽毛球收进筒的时候,只能从开口处放入羽毛球,取羽毛球的时候,也只能从开口处去拿的羽毛球。而且我们很容易发现先放进去的羽毛球往往是最后取出来的。
在栈中这样取羽毛球的操作,我们称之为出栈。放进去羽毛球的操作,我们称之为入栈。而“开口处”,我们称之为栈顶,因为出栈入栈的操作都在这里进行,与之相对的“封闭的底部”,无法从底部取出或者放入元素,我们称之为栈底。
栈在应用中的作用
比如在JVM中的Java虚拟中的栈帧,又或者是Java中的语法检查,以及编译器中的语法分析器等等。
具体实现
栈接口
/**
* title
* description
*
* @author 三文鱼
* @date2022/3/14
**/
public interface IStack {
//置空
public void clear();
//判空
public boolean isEmpty();
//返回栈中元素个数
public int length();
//读取栈顶元素
public Object peek();
//入栈
public void push(Object o) throws Exception;
//返回栈顶元素 出栈
public Object pop();
}
栈具体实现
/**
* title
* description
*
* @author 三文鱼
* @date2022/3/14
**/
public class SqStack implements IStack{
//对象数组实现栈
public Object[] stackElem;
//指向下一存储位置 为0时表示为空
public int top = 0;
public SqStack(int maxSize) {
stackElem = new Object[maxSize];
}
@Override
public void clear() {
top = 0;
}
@Override
public boolean isEmpty() {
return top == 0;
}
@Override
public int length() {
//top指向下一存储位置 即指向的是当前 下标+1 = 当前表长
return top;
}
//读取栈顶元素
@Override
public Object peek() {
if(top != 0)
return stackElem[top - 1];
else
return null;
}
//入栈
@Override
public void push(Object o) throws Exception {
if(top == stackElem.length)
throw new Exception("栈已满。");
else
stackElem[top++] = o;
}
//出栈
@Override
public Object pop() {
if(isEmpty())
return null;
else {
top = top - 1;
return stackElem[top];
}
}
}
栈测试
/**
* title
* description
*
* @author 三文鱼
* @date2022/3/14
**/
public class StackTest {
public static void main(String[] args) throws Exception {
SqStack sqStack = new SqStack(5);
sqStack.push("零");
sqStack.push("一");
sqStack.push("二");
sqStack.push("三");
System.out.println("==========================");
System.out.println("peek()测试,返回栈顶元素");
System.out.println("栈顶元素为: " + sqStack.peek());
System.out.println("==========================");
System.out.println("出栈测试,返回栈顶元素");
System.out.println("pop()出栈元素为: " + sqStack.pop() + " 出栈后栈顶元素为:" + sqStack.peek());
System.out.println("==========================");
System.out.println("入栈测试,返回栈顶元素");
sqStack.push("三");
System.out.println("入栈后栈顶元素为: " + sqStack.peek());
System.out.println("==========================");
System.out.println("length()测试,返回栈顶元素");
System.out.println("当前栈长度为: " + sqStack.length());
System.out.println("==========================");
System.out.println("栈满测试,存入元素四。");
sqStack.push("四");
System.out.println("当前栈顶元素为: " + sqStack.peek() + " 栈的长度为: " + sqStack.length());
System.out.println("尝试往已满栈中放入元素。");
try {
sqStack.push("五");
}
catch (Exception e){
System.out.println(e.toString());
}
System.out.println("==========================");
System.out.println("判空测试");
if(!sqStack.isEmpty()) {
System.out.println("栈不为空。栈顶元素为:" + sqStack.peek());
}
System.out.println("置空测试.");
sqStack.clear();
if(sqStack.isEmpty()) {
System.out.println("栈为空。栈顶元素为:" + sqStack.peek());
System.out.println("入栈元素wu." );
sqStack.push("wu");
System.out.println("栈顶元素为:" + sqStack.peek());
}
}
}