2.线性表——栈

1.什么是栈

    [1]. 栈是一种只能在一端进行插入和删除操作的线性表;插入:入栈(push);删除:出栈(pop);

    [2]. 栈是按照“先进后出”(Last In First Out, LIFO)的原则存储数据;

         栈顶(Top):允许删除和插入;

        栈底(Botton) ;

    [3]. 栈的分类:

静态栈:其核心是数组,类似于一个连续内存的数组,需要提前确定好栈的大小;

动态栈:其核心是链表,内存够用的前提下,可以无穷大,不连续;

    [4]. 栈的表示:

1.1 栈的表示

2. 栈的基本操作

    [1]. 栈的存储结构

    [2]. 进栈

    [3]. 出栈

    [4]. 判断空,判断满

    [5]. 栈的遍历

    [6]. 清空栈

    备注:静态栈参考【2.线性表——数组】

动态栈参考【2.线性表——链表】

3. 静态栈的代码实现

    [1]. 静态栈的存储结构

public class MyStack {
    final int STACKSIZE = 5; // 声明栈的容量
    // 注意:final 的用法;
    public int bottom;
    public int top;
    public int[] arr;

    public MyStack() {
        bottom = top = -1;
        arr = new int[STACKSIZE];
    }
}

    [2]. 静态栈的基本操作实现

package com.Stack;

/*
* 静态栈的基本操作:
*       1. 初始化,创建
*       2. 入栈
*       3. 出栈
*       4. 判断空;判断满;
*       5. 遍历
*       6. 清空
*
* */

public class DemoStack {
    // 判断满
    public static boolean isFull(MyStack stack){
        if(stack.top >= stack.STACKSIZE-1) // 利用数组构建的静态栈的下标是从0开始的
            return true;
        else
            return false;
        // 判断满,简写代码:return stack.top >= stack.STACKSIZE-1;
    }

    // 判断空
    public static boolean isEmpty(MyStack stack){
        if(stack.top == stack.bottom)
            return true;
        else
            return false;
        // 简写:return stack.top == stack.bottom;
    }

    // 进栈
    public static boolean poshStack(MyStack stack,int data){
        if(isFull(stack)){
            System.out.println("当前栈已满!");
            return false;
        }else{
            stack.arr[++stack.top] = data;
            return true;
        }
    }

    // 出栈
    public static boolean popStack(MyStack stack){
        if(isEmpty(stack)){
            System.out.println("当前栈为空!");
            return false;
        }else{
            System.out.println("栈顶元素出栈:"+stack.arr[stack.top--]);
            return true;
        }
    }

    // 遍历输出
    public static boolean printOutStack(MyStack stack) {
        if(isEmpty(stack)){
            System.out.println("当前栈为空!无法输出");
            return false;
        }else{
            int length = stack.top - stack.bottom;
            System.out.print("栈遍历输出:");
            for(int i=length-1 ; i>=0; i--){
                System.out.print(stack.arr[i]+" ");
            }
            System.out.println("\n"+"==============分隔符===================");
            return true;
        }
    }

    // 清空栈
    public static boolean clearStack(MyStack stack){
        if(isEmpty(stack)){
            System.out.println("当前栈为空!");
            return false;
        }else{
/*           int length = stack.top - stack.bottom;
             for(int i=length-1 ; i>=0; i--){
                 stack.arr[i] = 0;
                 stack.top--;
            }*/
            stack.arr = null;// java内部会不定时的启动【垃圾回收机制】,对堆内存空间进行回收
            stack.top = stack.bottom = -1;
            return true;
        }
    }

    public static void main(String[] args) {
        MyStack stack = new MyStack();

        poshStack(stack,1);
        poshStack(stack,2);
        poshStack(stack,3);
        poshStack(stack,4);
        poshStack(stack,5);
        System.out.println("入栈后");
        printOutStack(stack);

        popStack(stack);
        popStack(stack);
        System.out.println("出栈后");
        printOutStack(stack);

        clearStack(stack);
        if(isEmpty(stack)){
            System.out.println("栈已清空 !");
        }
        printOutStack(stack);
    }
}

    [3]. 运行结果

4. 动态栈的代码实现(待更)

    [1]. 动态栈的存储结构

    [2]. 动态栈的基本操作实现

    [3]. 运行结果

备注:学习过程中难免会出现很多错误,请大家指教!有问题可以直接评论我,谢谢!

原文地址:https://www.cnblogs.com/ZHOUsya/p/12642058.html

时间: 2024-10-12 16:22:26

2.线性表——栈的相关文章

数据结构和算法学习总结04 线性表---栈

栈 栈(Stack)是特殊的线性表,是只允许在一端进行插入和删除的线性表. 允许插入和删除的叫栈顶,反之则是栈底. 栈的插入称为进栈,删除称为出栈. 特性是:后进先出,所以栈也叫后进先出表,简称LIFO表(Last In First Out). 因为栈是线性表,所以也有顺序表和链表两种形式,一般我们常用顺序表. 从代码中可以看出:与顺序表相比实际上就是插入和删除操作发生了改变. #include <iostream> using namespace std; const int Stack_S

数据结构-线性表-栈

栈:后进先出(LIFO) last in first out栈是一种特殊的线性表,只能在线性表的一端进行操作.栈顶 top栈底 bottom 实现方式:顺序结构实现,线性结构实现 链式存储实现 LinkStack.h #ifndef _LINKSTACK_H_ #define _LINKSTACK_H_ typedef void LinkStack; LinkStack* LinkStack_Create(); void LinkStack_Destroy(LinkStack* stack);

5 线性表-栈-链式存储

头大-- 栈是一种功能受限的线性表 1.基本功能实现 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream> 4 using namespace std; 5 #define TRUE 1 6 #define FALSE 0 7 #define OK 1 8 #define ERROR 0 9 #define OVERFLOW -2 10 #define STACK_INIT_SIZE 100//存储空

线性表——栈

package Algorithm; /**  * 栈   * 1.先进后出  * 2.对插入/删除操作的"限定",只能在表的一端进行插入删除操作  * 3.遍历数据速度不同,最先放入最后取出,遍历数据需要开辟临时空间  */ public class MyStack { private Object[] data; private int size; private int top; public MyStack() { super(); this.data = new Object

6 线性表-栈-顺序存储

自己简直是强迫症晚期,上次因为对访问结构体成员该用什么方法困惑了很久,导致没把顺序存储的捣鼓出来(明明比链式的要好写) 今天花了个20分钟调好了 因为今天比较晚,赶时间就没给类型起别名用ElemType写,直接用了int类型.需要的话可以自行更改. 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream> 4 using namespace std; 5 #define maxsize 50 6 /*顺序

7 线性表-栈-顺序存储的拓展-迎面增长的存储方式

描述:设有两个栈,S1和S2,都采用顺序栈的存储方式.两个栈共享一个存储区:[0,--maxsize-1]目的:可以尽量利用空间,减少溢出的可能,采用栈顶相向.迎面增长的存储方式 PS:要注意判断栈满栈空的检查 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; #define maxsize 100 /*栈结构的定义*/ typedef struct { int st

2 限定性线性表——栈与队列

1 栈与队列     1.1 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数 在该栈中,调用min.push和pop方法 要求时间复杂度均为O(1) 算法思想: 要求时间复杂度均为 O(1),增加辅助空间实现,即增加一个辅助栈存储min值 例如:data 中依次入栈 5, 4, 3, 8, 10, 11, 12, 1, 则 min 中依次入栈 5, 4, 3,no,no, no, no, 1. no 代表此次不如栈,如果入栈的元素小于等于 min 中的栈

数据结构_线性表_顺序存储之1顺序栈2共享栈_链式存储之链栈_栈的应用举例

1>//栈是先进后出,后进先出的线性表 简称LIFO线性表 //栈的顺序存储结构成为顺序栈(sequebtial stack). //顺序栈利用一组地址连的存储单元依次存放从栈底到 栈顶的数据元素,通常用一维数组存放栈的元素 //"指针"top并非指针,而是表示栈顶元素的当前位置 //top不是指针型变量而是整形变量,top=0空栈,top=MaxSize 表示满栈,当top>maxsize 表示栈溢出 代码 #include <stdio.h> #includ

python web为什么要学数据结构与算法面试官为什么总问那几个算法和线性表二叉树

算法是什么? 举个简单的例子 当年刘景生病危刘琦被卷入继位之事 无奈求助于诸葛亮 以上古兵书为由 邀孔明阁楼相谈.... 诸葛亮曾说 那部阵书开篇就是阵法源自于心法 所以古代军师进步也是看兵法 算法也是同理 虽然我们作为web后端开发人员 但是每天所见所闻日子久也就适应了. 但是想要再进一步 两种方法 一 多看高质量代码 二 看算法 我们作为web开发可能算法运用的不是很多 每天也就是写接口调接口和产品经理撕 但是算法最重要的地方是会帮你扩充你的逻辑思维 可能刚看算法的人认为太难了我真学不来 举