尚硅谷 栈的学习笔记
Posted 冷血~多好
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷 栈的学习笔记相关的知识,希望对你有一定的参考价值。
目录
栈的介绍
- 栈的英文为(stack) 栈是一个先入后出(FILO-First In Last Out)的有序列表。
- 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。
- 允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
- 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除
出栈(pop)和入栈(push)的概念(如图所示)
栈的应用场景
- 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
- 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
- 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
- 二叉树的遍历。
- 图形的深度优先(depth一first)搜索法。
栈的快速入门
数组模拟栈
用数组模拟栈的使用,由于栈是一种有序列表, 当然可以使用数组的结构来储存栈的数据内容, 下面我们就用数组模拟栈的出栈,入栈等操作。
实现思路分析,并画出示意图
实现 栈的 思路分析
- 使用数组来模拟栈
- 定义一个 top 来表示栈顶,初始化 为 -1
- . 入栈的操作,当有数据加入到栈时, top++; stack[top] = data;
- 出栈的操作, int value = stack[top]; top--, return value
package com.stack;
import java.util.Scanner;
/*
*
* 数组模拟栈
* */
public class ArrayStackDemo {
public static void main(String[] args) {
//测试一下ArrayStack是否正确
//先创建一个ArrayStack对象->表示栈
ArrayStack stack=new ArrayStack(4);
String key="";
boolean loop=true;//控制是否退出菜单
Scanner scanner=new Scanner(System.in);
while (loop){
System.out.println("show:表示显示栈");
System.out.println("exit:退出程序");
System.out.println("push:表示添加数据到栈(入栈)");
System.out.println("pop:表示从栈取出数据(出栈)");
System.out.println("请输入你的选择");
key=scanner.next();
switch (key){
case "show":
stack.list();
break;
case "push":
System.out.println("请输入一个数");
int value=scanner.nextInt();
stack.push(value);
break;
case "pop":
try{
int res=stack.pop();
System.out.printf("出栈的数据是%d\\n",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case "exit":
scanner.close();
loop=false;
break;
default:break;
}
}
System.out.println("程序退出了");
}
}
//定义一个ArrayStack表示栈
class ArrayStack{
private int maxsize;//栈的大小
private int[] stack;//数组,数组模拟栈,数据就放在改数组
private int top=-1;//top表示栈顶,初始化为-1
//构造器
public ArrayStack(int maxsize) {
this.maxsize = maxsize;
stack=new int[this.maxsize];
}
//栈满
public boolean isFull(){
return top==maxsize-1;
}
//栈空
public boolean isEmpty(){
return top==-1;
}
//入栈-push
public void push(int value){
//先判断栈是否满
if(isFull()){
System.out.println("栈满");
return;
}
top++;
stack[top]=value;
}
//出栈-pop,将栈顶的数据返回
public int pop(){
//先判断栈是否空
if(isEmpty()){
//抛出异常
throw new RuntimeException("栈空,没有数据");
}
int value=stack[top];
top--;
return value;
}
//显示栈的情况【遍历栈】】,遍历时,需要从栈顶开始显示数据
public void list(){
if (isEmpty()){
System.out.println("栈空,没有数据~~");
return;
}
//需要从栈顶开始显示数据
for(int i=top;i>=0;i--){
System.out.printf("stack[%d]=%d\\n",i,stack[i]);
}
}
}
单链表模拟栈
思路:通过链表的尾插法进行保存链表节点,从而达到先进后出的效果
package com.stack;
/*
链表实现栈
*/
import java.util.Scanner;
public class LinkStackDemo {
public static void main(String[] args) {
StackList stackList=new StackList();
String key="";
boolean loop=true;//控制是否退出菜单
Scanner scanner=new Scanner(System.in);
while (loop){
System.out.println("show(s):表示显示栈");
System.out.println("exit(e):退出程序");
System.out.println("push(i):表示添加数据到栈(入栈)");
System.out.println("pop(o):表示从栈取出数据(出栈)");
System.out.println("请输入你的选择");
key=scanner.next();
switch (key){
case "s":
stackList.showStackList();
break;
case "i":
System.out.println("请输入一个数");
int value=scanner.nextInt();
NodeStack nodeStack=new NodeStack(value);
stackList.push(nodeStack);
break;
case "o":
stackList.pop();
break;
case "e":
scanner.close();
loop=false;
break;
default:break;
}
}
System.out.println("程序退出了");
}
}
class StackList{
//先初始化一个头节点,头节点不用动
private NodeStack head=new NodeStack(0);
//入栈-push,思路:通过链表的头插法
public void push(NodeStack nodeStack){
//因为头节点不能动,因此我仍然通过一个辅助指针来辅助找到位置
NodeStack temp=head;
NodeStack next=null;//指向下一个节点
if(temp.next==null){
temp.next=nodeStack;
return;
}
next=temp.next;
temp.next=nodeStack;
nodeStack.next=next;
}
//出栈-pop,将栈顶的数据返回
public void pop(){
//栈后进先出原则,因为使用了头插法,所以把头部指向的第一个元素出栈。
if(head.next==null){
System.out.println("栈为空,没有数据");
return;
}
NodeStack next=null;//定义一个辅助指针
next=head.next;//把辅助指针指向栈顶
System.out.println("出栈的元素为:"+next.no);
head.next=next.next;//头部指针指向第二个指针,栈顶元素出栈
}
//遍历栈
public void showStackList(){
//判断栈是否为空
if(head.next==null){
System.out.println("栈为空");
return;
}
NodeStack temp=head.next;
while (true){
if(temp==null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
}
//定义NodeStack,每个NodeStack对象就是一个节点
class NodeStack{
public int no;
public NodeStack next;
public NodeStack(int no) {
this.no = no;
}
@Override
public String toString() {
return "栈的元素为:" +
"no=" + no;
}
}
以上是关于尚硅谷 栈的学习笔记的主要内容,如果未能解决你的问题,请参考以下文章