【数据结构与算法】【数据存储类型】栈

举报
huahua.Dr 发表于 2021/08/30 23:43:09 2021/08/30
【摘要】 栈是程序的一种数据存储结构,是对数组或链表等其他结构的一个抽象,也就是说使用数据或链表可以实现栈这种数据结构,栈有自己的独特机制,就是同一时刻只允许访问一个数据项,最先插入的数据项最后一个被访问,是一种先进后出的特性,访问和操作数据项以栈顶为入口,进栈、出栈和查看等操作都是操作栈顶的位置,也就是说进出栈后栈顶的位置就变了

一、什么是栈

栈是程序的一种数据存储结构,是对数组或链表等其他结构的一个抽象,也就是说使用数据或链表可以实现栈这种数据结构,栈有自己的独特机制,就是同一时刻只允许访问一个数据项,最先插入的数据项最后一个被访问,是一种先进后出的特性,访问和操作数据项以栈顶为入口,进栈、出栈和查看等操作都是操作栈顶的位置,也就是说进出栈后栈顶的位置就变了。利用这种特性,可以让我们更好处理一下复杂的场景:单词逆序、分隔符匹配等等。

二、如何实现栈这种数据结构

实现栈这种先进后出的特性,比较常用的可以利用数组或链表去实现,下面以链表为例说一下如何实现栈。(Java中已经实现了栈这种数据结构Stack类)

实现之前先说一下对于栈数据结构需要具备的基本几个操作

  • push()方法:将数据项压入栈中
  • pop()方法:将栈顶的数据项弹出
  • peek()方法:查看栈顶的数据项,但不做移除操作
  • isEmpty()方法:判断是否为空栈
  • isFull()方法:判断栈是否已满
public class StackHua {

    private int maxSize;//栈大小

    private int[] stackArray; // 通过数组实现栈

    private int top;//栈顶位置

 

    public StackHua(int maxSize) {

        this.maxSize = maxSize;

        this.stackArray = new int[maxSize];

        top = -1;

    }

    public void push(int item){

        stackArray[++top] = item;

    }

    public int pop(){

        return stackArray[--top];

    }

    public int peek(){

        return stackArray[top];

    }

    public boolean isEmpty(){

        return top == -1;

    }

    public boolean isFull() {

        return top == maxSize-1;

    }

}

三、Java中的栈

java中的栈Stack类,是通过动态数组实现了栈这种数据结构,Stack类继承了一个Vector类,该类是一个同步的ArrayList,跟ArrayList类似,主要原因是Vector类也实现了一个动态数组并且操作方法都是同步的,即在相关操作方法上使用synchronized关键字,保证原子性;但是在动态数组扩容时就显得很脆弱了。

Stack类中就几个方法:所要保存的数据项类型为泛型,根据创建Stack实例的时候可以确定具体类型。默认数组大小为10。

  •     push(E  item):将一个数据项压入栈中
  •     pop():将栈顶的数据项弹出
  •     peek():查询栈顶的数据项
  •     empty():判断栈是否为空
  •     search(Object o):搜索指定数据项在栈中的位置

栈使用实例:单词逆序

public class Main {
    public static void main(String[] args)  {
        String works = "Anything is possible";
        System.out.println("单词正序:"+works);
        Stack stack =new Stack();
        for (int i = 0; i < works.length(); i++) {
            char work = works.charAt(i);
            stack.push(work);
        }
        StringBuilder result = new StringBuilder();
        while (!stack.empty()) {
            result.append(stack.pop());
        }
        System.out.println("单词逆序:"+result.toString());
    }
}

输出:

单词正序:Anything is possible
单词逆序:elbissop si gnihtynA

四、Java中栈stack的缺点

由于java中的Stack类是继承与Vector类,而Vector类已经被官方推荐不使用了,应为所有操作方法都为同步Synchronized方法,在高并发的场景下,效率很低,而且还是用动态数组实现,在大数据场景下,动态数据扩容效率也是很低,因此不推荐。后面推荐使用链表实现的栈更为高效,即使用队列来实现(使用双端链表实现)

五、栈的效率

栈的出栈和入栈的时间复杂度都为O(1),也就是说对栈的操作所耗时间不依赖栈的数据项的个数,操作效率极高。栈是我们写程序的一个很好的辅助工具;利用好它可以达到事倍功半的效果。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。