博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据结构java篇】- 栈
阅读量:4147 次
发布时间:2019-05-25

本文共 6291 字,大约阅读时间需要 20 分钟。

文章目录

1 栈的一个实际需求

请输入一个表达式

计算式:[722-5+1-5+3-3]点击计算【如下图】
在这里插入图片描述
请问:计算机底层是如何运算得到结果的?注意不是简单的把算式列出运算,因为我们看这个算式722-5,但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。->栈

2 栈的介绍

  1. 栈的英文为(stack)。
  2. 栈是一个先入后出(FILO-FirstInLastOut)的有序列表。
  3. 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
  4. 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。
  5. 图解方式说明出栈(pop)和入栈(push)的概念。
    在这里插入图片描述

3 栈的应用场景

  1. 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
  2. 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
  3. 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
  4. 二叉树的遍历。
  5. 图形的深度优先(depth一first)搜索法。

4 栈的快速入门

  1. 用数组模拟栈的使用,由于栈是一种有序列表,当然可以使用数组的结构来储存栈的数据内容,下面我们就用数组模拟栈的出栈,入栈等操作。
  2. 实现思路分析,并画出示意图
    在这里插入图片描述
  3. 代码实现
package com.sukang.stack;import java.util.Scanner;/** * @description: 数组栈 * @author: sukang * @date: 2020-01-09 17:25 */public class ArrayStackDemo {
public static void main(String[] args) {
ArrayStack arrayStack = new ArrayStack(5); String key = ""; boolean loop = true; Scanner scanner = new Scanner(System.in); while (loop){
System.out.println("show: 显示栈列表"); System.out.println("push: 入栈"); System.out.println("pop: 出栈"); System.out.println("exit: 退出"); System.out.println("请输入你的选择:"); key = scanner.next(); switch (key){
case "show": arrayStack.list(); break; case "push": System.out.println("请输入一个需要入栈的数:"); int nub = scanner.nextInt(); arrayStack.push(nub); break; case "pop": try {
int num = arrayStack.pop(); System.out.printf("出栈的数为:%d\n",num); } catch ( Exception e ) {
e.printStackTrace(); } break; case "exit": loop = false; scanner.close(); break; default: break; } } System.out.printf("退出程序~~"); }}//定义一个数组的类class ArrayStack{
private int maxNub;//数组的最大容量 private int[] stack; //定义一个数组来充当栈 private int top = -1; //申明一个栈顶,默认为-1 public ArrayStack(int maxNub) {
this.maxNub = maxNub; stack = new int[maxNub]; } //判断是否栈满 public boolean isFull(){
return top == maxNub - 1; } //判断是否栈空 public boolean isEmpty(){
return top == -1; } //往栈中添加一个数据 public void push(int num){
if(isFull()){
System.out.println("栈已经满了,不能再添加"); return; } top ++; stack[top] = num; } //从栈中取出数据 public int pop(){
if(isEmpty()){
throw new RuntimeException("栈已空,没法取数据"); } int temp = stack[top]; top --; return temp; } public void list(){
if(isEmpty()){
System.out.println("空栈!"); return; } int temp = top; while (true){
if(temp == -1){
System.out.println("栈已经遍历完了"); break; } System.out.printf("遍历数为%d\n",temp+1, stack[temp]); temp --; } }}

链表来模拟栈代码

package com.sukang.stack;import java.util.Scanner;import java.util.Stack;/** * @description: 链表实现栈 * @author: sukang * @date: 2020-01-10 10:05 */public class LinkedStackDemo {
public static void main(String[] args) {
LinkedStack linkedStack = new LinkedStack(); String key = ""; boolean loop = true; Scanner scanner = new Scanner(System.in); while (loop){
System.out.println("show: 显示栈列表"); System.out.println("push: 入栈"); System.out.println("pop: 出栈"); System.out.println("exit: 退出"); System.out.println("请输入你的选择:"); key = scanner.next(); switch (key){
case "show": linkedStack.list(); break; case "push": System.out.println("请输入一个需要入栈的数:"); int nub = scanner.nextInt(); Node node = new Node(nub); linkedStack.push(node); break; case "pop": try {
Node node1 = linkedStack.pop(); System.out.println("出栈为:"+node1); } catch ( Exception e ) {
e.printStackTrace(); } break; case "exit": loop = false; scanner.close(); break; default: break; } } System.out.printf("退出程序~~"); }}class LinkedStack{
private Node head = new Node(0); public void push(Node node){
Node temp = head; while (true){
if(temp.next == null){
break; } temp = temp.next; } temp.next = node; } public Node pop(){
if(head.next == null){
throw new RuntimeException("链表为空!"); } Node temp = head; while (true){
if(temp.next.next == null){
break; } temp = temp.next; } Node temp1 = temp.next; temp.next = temp.next.next; return temp1; } public void list(){
if(head.next == null){
System.out.println("空栈!"); return; } Stack
stack = new Stack<>(); Node temp = head; while (true){
if(temp.next == null){
break; } stack.add(temp.next); temp = temp.next; } while (true){
if(stack.size() <= 0){
break; } System.out.println(stack.pop()); } }}class Node{
public int data; public Node next; public Node(int data){
this.data = data; } @Override public String toString() {
return "Node["+data+"]"; }}

转载地址:http://ganti.baihongyu.com/

你可能感兴趣的文章
JAVA多线程(二)竞态条件、死锁及同步机制
查看>>
乐观锁与悲观锁——解决并发问题
查看>>
Java学习笔记---多线程同步的五种方法
查看>>
java笔记--关于线程同步(7种同步方式)
查看>>
Java 并发工具包 java.util.concurrent 用户指南
查看>>
队列同步器(AQS)详解
查看>>
Java线程】Java内存模型总结
查看>>
进程间通信与线程间通信
查看>>
java内存模型
查看>>
ConcurrentHashMap源码解析
查看>>
JSP九大内置对象
查看>>
动态代理两种方式及比较
查看>>
QueryRunner的使用
查看>>
使用Tomcat+腾讯云主机把你的项目发布到外网上
查看>>
servlet的执行原理与生命周期
查看>>
Java内存模型与Java线程的实现原理
查看>>
深入理解Java内存模型
查看>>
Windows下Redis的安装使用
查看>>
cmd命令行大全 dos命令 cmd命令整理
查看>>
TCP连接状态详解及TIME_WAIT过多的解决方法
查看>>