栈(stack) 先进后出
- 栈:只允许在一端进行插入、删除操作的线性表。
- 空栈:不含任何数据元素的栈。
- 允许插入(也称进栈、压栈、入栈)、删除(也称出栈)的一端称为栈顶。
1. 用数组模拟栈的实现:
小邋遢的衣橱
小邋遢 MS.Jinlin 是个爱打扮的公主,他有很多晚礼服如"LALA" "NIHAOMA"、"WOBUHAO"、"NIHAOBUHAO"等众多衣服,小邋遢在经过几次的叠衣服和取衣服后,他想知道箱子里最上面的衣服是哪一件,如果箱子为空的话,就告诉她 Empty ,如果有多件一样的衣服,肯定是取走最上面的那一件啦。
输入:
第 1 行,输入N,代表共计进行了几次操作
第 2 行至第 N+1 行,进行in out 操作
in 为 放入衣服
out 为 取出衣服
格式:
in name1
out name2
样例 :
输入:
6
in AMDYES
in INTELNO
in USBAD
in CNYES
out INTELNO
in MDICN
输出:
MDICN
代码实现:
package 栈;
import java.util.Scanner;
public class QuYiFu {
final static int maxsize = 100005;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();// 操作次数
for (int i = 0; i < n; i++) {
String opString = scanner.next();//每次操作时,是放进in还是取出out,就是来存放每次操作的前面的字符串
String nameString = scanner.next();
//当是存进,in操作,就调用入栈函数
if(opString.contains("in")) {
in(nameString);
}
else {//当是取出,out操作,就调用出栈函数
//首先要先判断栈顶元素是否是要取出的,若不是,就循环输出前面不是的元素
while(!getTop().equals(nameString)) {
out();
}
out();
}
}
//接下来,就是输出部分:
if(isEmpty()) {
System.out.println("Empty");
}
else {
System.out.println(getTop());
}
}
// 1.先建存放栈数据结构,采用顺序表
static String[] mystack = new String[maxsize]; // 栈
static int top = 0; // 栈顶指针
// 2.声明并定义入栈函数
static boolean in(String name) {
// 判栈满
if (top >= maxsize) {
return false;
} else {
mystack[++top] = name;//此处,必须为++top 先令top+1 ,比如,起初top=0 必须先加1,代表存进栈的元素个数加1
return true;
}
}
// 3.判栈是否为空
static boolean isEmpty() {
if (top != 0) {
return false;
} else {
return true;
}
}
// 4. 声明并定义出栈函数
static boolean out() {
// 判栈空
if (isEmpty()) {
return false;
} else {
top--;
return true;
}
}
// 5.获取栈顶元素
static String getTop() {
// 判空
if (isEmpty()) {
return "";
} else {
return mystack[top];
}
}
}
2. Java 的内置栈类
-
栈是 Vector 的一个子类,它实现了一个标准的后进先出的栈,至于什么是 Vector,大家可以理解为能力超强的数组;
-
堆栈定义了默认构造函数,用来创建一个空栈。
在 Java 的 stack 模板定义了如下操作流程:
-
push():
执行 push 时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。
-
peek():
执行 peek 时(即,取出栈顶元素,不执行删除,可以理解为只是看一眼),是返回数组末尾的元素。
-
pop():
执行 pop 时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。
-
empty():
继承于 Vector,返回是否为空
-
size():
继承 Vector,返回元素的个数。
代码实现:
package 栈; import java.util.Scanner; import java.util.Stack; public class QuYiFu2 { static Stack mystack = new Stack (); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt();// 操作次数 for (int i = 0; i < n; i++) { String opString = scanner.next();//每次操作时,是放进in还是取出out,就是来存放每次操作的前面的字符串 String nameString = scanner.next(); //当是存进,in操作,就调用入栈函数 if(opString.contains("in")) { mystack.push(nameString); } else {//当是取出,out操作,就调用出栈函数 //首先要先判断栈顶元素是否是要取出的,若不是,就循环输出前面不是的元素 while(!mystack.peek().equals(nameString)) { mystack.pop(); } mystack.pop(); } } //接下来,就是输出部分: if (( mystack.empty())) { System.out.println("Empty"); } else { System.out.println(mystack.peek()); } } }
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现